思路:?jiǎn)捂湵矸崔D(zhuǎn)
Head -> Node1 -> Node2 -> Node3 -> Node4
如果將一個(gè)節(jié)點(diǎn)的next指針指向上一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)與下一個(gè)節(jié)點(diǎn)的關(guān)系,引入變量tmp做臨時(shí)存儲(chǔ)。
pre <- cur tmp->
pre tmp
不停做替換直到最后一次將為nil的tmp賦值給cur判斷為至。頭指針注意最后一次指向非空prev,原因最后一次做了不符合條件的替換。
package main
import (
"fmt"
)
type LNode struct {
data int;
next *LNode;
}
func main() {
Head := &LNode{}
create(Head,10)
node := Head.next;
for i:=0;i<10 ;i++ {
fmt.Println(node.data)
node = node.next
}
reverseLinkList(Head)
node = Head.next;
for i:=0;i<10 ;i++ {
fmt.Println(node.data)
node = node.next
}
}
func create(node *LNode,num int) {
for i:=0; i<num;i++ {
newNode := LNode{i,nil}
node.next = &newNode
node = &newNode
}
}
//Head -> node1 -> node2 -> node3
//
//
//Head nil <- node1 node2 -> node3
// prev cur tmp
// | |
// prev cur
//
//
//
// nil <- node1 <- node2 node3
//
// prev cur tmp
//
// prev cur
func reverseLinkList(Head *LNode) {
cur := Head.next
Head.next = nil; //可省略,循環(huán)體中會(huì)指向?yàn)閚il的prev
var prev *LNode
var tmp *LNode
for cur!=nil{
tmp = cur.next
cur.next=prev
prev = cur
cur = tmp
}
Head.next = prev;
}
//遞歸法
func reverseList(head *ListNode) *ListNode {
if(head.Next == nil){
return head
}
p:= reverseList(head.Next)
head.Next.Next = head
head.Next = nil //避免尾部環(huán) 1->2->3->4->5 5->4->3->2->1->2->1
return p //返回尾節(jié)點(diǎn)
}