題目
Golang 實作【連結清單反轉】 如何反轉一個單連結清單。
題目示例
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
連結清單結構
type ListNode struct {
Val int
Next *ListNode
}
第一種實作
解題思路:
利用指針互動的思路
複雜度分析:
時間複雜度 O(N) : 周遊連結清單使用線性大小時間。
空間複雜度 O(1): 變量 pre 和 cur 使用常數大小額外空間。
func reverseList(cur *ListNode) *ListNode {
if cur == nil {
return nil
}
var pre *ListNode
for cur!=nil {
//擷取下個節點temp
temp:=cur.Next
//因要翻轉,故cur.next=pre 下一個節點等于前一個節點
cur.Next=pre
//将目前節點指派給前節點
pre=cur
//将temp節點指派給目前節點,用于繼續往下執行
cur=temp
//平行指派文法 可讀性差
//cur.Next,pre,cur=pre,cur,cur.Next
}
return pre
}
第二種實作
利用遞歸思路實作
func reverseListV2(head *ListNode) *ListNode {
if head == nil {
return nil
}
//初始時,pre為nil
return recur(head,nil)
}
func recur(cur,pre *ListNode) *ListNode {
//目前cur為nil 說明到了尾節點
if cur == nil {
return pre
}
//遞歸反轉,故下個節點,即目前節點,目前節點為前節點
res:=recur(cur.Next,cur)
//将前節點,指派給cur.Next
cur.Next=pre
return res
}
Golang解題代碼
type ListNode struct {
Val int
Next *ListNode
}
func TestListNode(t *testing.T){
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
//Println(reverseList(head))
Println(reverseListV2(head))
}
func Println(list *ListNode) {
for list!=nil{
fmt.Printf("val:%v ",list.Val)
list = list.Next
}
}
func reverseList(cur *ListNode) *ListNode {
if cur == nil {
return nil
}
var pre *ListNode
for cur!=nil {
//擷取下個節點temp
temp:=cur.Next
//因要翻轉,故cur.next=pre 下一個節點等于前一個節點
cur.Next=pre
//将目前節點指派給前節點
pre=cur
//将temp節點指派給目前節點,用于繼續往下執行
cur=temp
//平行指派文法 可讀性差
//cur.Next,pre,cur=pre,cur,cur.Next
}
return pre
}
func reverseListV2(head *ListNode) *ListNode {
if head == nil {
return nil
}
//初始時,pre為nil
return recur(head,nil)
}
func recur(cur,pre *ListNode) *ListNode {
//目前cur為nil 說明到了尾節點
if cur == nil {
return pre
}
//遞歸反轉,故下個節點,即目前節點,目前節點為前節點
res:=recur(cur.Next,cur)
//将前節點,指派給cur.Next
cur.Next=pre
return res
}
結果驗證