链表翻转,下面是最简单的一种链表翻转
基本上有两个方法:
package main
import "fmt"
type Node struct {
Element int
Next *Node
}
func (n *Node) Generate(num int) {
tailNode := n
for i := 0; i < num; i++ {
node := &Node{Element: i + 1}
tailNode.Next = node
tailNode = node
}
}
//Print 打印
func (n *Node) Print() {
tailNode := n
fmt.Println("======print======")
for tailNode != nil {
fmt.Printf("ele: %d\n", tailNode.Element)
tailNode = tailNode.Next
}
}
//Reverse1 双指针链表翻转
func (n *Node) Reverse1() *Node {
cur := n
var pre *Node
for cur != nil {
tmp := cur.Next
cur.Next = pre
pre = cur
cur = tmp
}
return pre
}
//Reverse2 递归翻转
func (n *Node) Reverse2(head, pre *Node) *Node {
if head == nil {
return pre
}
res := n.Reverse2(head.Next, head)
head.Next = pre
return res
}
func main() {
head := &Node{Element: 0}
head.Generate(10)
head.Print()
head = head.Reverse1()
head.Print()
head = head.Reverse2(head, nil)
head.Print()
}
可以看到Go是真的大道至简呀!!
指针安全,默认零值可以让你少些不少代码。