题目:
思路:
- 声明一个空的节点(pre),表示前一个节点
- 变量 cur 表示第一个节点
开始:
- 将第二个节点“位置”先保存到一个临时变量,防止 1,2 节点断开后找不到2节点;
- 第一个节点 cur 的 next 指向 pre ,完成 1 节点的翻转;
- pre 和 cur 分别向后移动一个节点;
- 重复上面 3 步,依次完成节点翻转;
核心代码:
//反转链表的实现
func reverseList(head *ListNode) *ListNode {
var pre *ListNode = nil
cur := head
for cur != nil {
nextTemp := cur.Next //1. 将下一个节点保存到临时变量,防止下面覆盖丢失
cur.Next = pre //2. 当前节点指向前节点,当前节点完成转换
pre = cur //3. 前节点变当前节点,给下一个节点转换做准备
cur = nextTemp //4. 当前节点变下节点,给下一个节点转换做准备
//pre, cur, cur.Next = cur, cur.Next, pre //上面四步可以总结为此处一行
}
return pre
}
完整代码演示:
package main
import "fmt"
//链表节点
type ListNode struct {
Val int
Next *ListNode
}
//反转链表的实现
func reverseList(head *ListNode) *ListNode {
var pre *ListNode = nil
cur := head
for cur != nil {
nextTemp := cur.Next //1. 将下一个节点保存到临时变量,防止下面覆盖丢失
cur.Next = pre //2. 当前节点指向前节点,当前节点完成转换
pre = cur //3. 前节点变当前节点,给下一个节点转换做准备
cur = nextTemp //4. 当前节点变下节点,给下一个节点转换做准备
//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
this1 := head
for this1 != nil {
fmt.Println(this1.Val)
this1 = this1.Next
}
pre := reverseList(head)
fmt.Println("翻转后:")
this2 := pre
for this2 != nil {
fmt.Println(this2.Val)
this2 = this2.Next
}
}
运行结果:
1
2
3
4
5
翻转后:
5
4
3
2
1