本文摘自php中文网,作者藏色散人,侵删。
问题:反转一个单链表。
1 2 | 输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
|
首先先认识一下链表这个数据结构:
链表节点中有两个元素:
1 2 3 4 | type ListNode struct {
Val int
Next *ListNode
}
|
Next指向下一个节点

那么这道题其实就是把指针指向前一个节点
位置调换次数 | pre | cur | whole |
---|
0 | nil | 1->2->3->4->5 | 1->2->3->4->5 |
1 | 1->nil | 2->-3>->4->5 | 2->3->4->5->1->nil |
2 | 2->1->nil | 3->4->5 | 3->4->5->2->1->nil |
3 | 3->2->1->nil | 4->5 | 4->5->3->2->1->nil |
4 | 4->3->2->1->nil | 5 | 5->4->3->2->1->nil |
可以看出来
- pre是cur的最前面那位(pre = cur)
- cur就是当前位的后面链表元素(cur = cur.Next)
- cur.Next肯定是接pre(cur.Next = pre)
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func reversrList(head *ListNode) *ListNode {
cur := head
var pre *ListNode = nil
for cur != nil {
pre, cur, cur.Next = cur, cur.Next, pre
}
return pre
}
func main() {
head := new (ListNode)
head.Val = 1
ln2 := new (ListNode)
ln2.Val = 2
ln3 := new (ListNode)
ln3.Val = 3
ln4 := new (ListNode)
ln4.Val = 4
ln5 := new (ListNode)
ln5.Val = 5
head.Next = ln2
ln2.Next = ln3
ln3.Next = ln4
ln4.Next = ln5
pre := reversrList(head)
fmt.Println(pre)
}
|
更多golang相关技术文章,请访问golang教程栏目!
以上就是一文讲解golang怎么实现反转链表的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
golang判断是否存在不存在就创建文件
手撸golang 创建型设计模式 工厂方法
go语言从入门到实战,带你拿下golang的高效编程法
golang 创建型设计模式 建造者模式
leetcode 最接近目标值的子序列和 golang
用go实现进制之前的转化
聊聊dubbo-go-proxy的remotefilter
golang io读取文件与判断文件是否存在的方法
手撸golang 行为型设计模式 迭代器模式
golang 踩坑时间parse转换后加8小时
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » 一文讲解golang怎么实现反转链表