您诸位好啊,我是无尘,之前 Go 通关的系列文章已经完结了,接下来,我们使用 Go 语言来刷一些力扣算法题目,练习 Go 的同时,还能掌握算法,一举两得!
题目:
思路:
原始链表
开始:
翻转步骤1
翻转步骤2
翻转步骤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