1. 程式人生 > 實用技巧 >劍指 Offer 06. 從尾到頭列印連結串列

劍指 Offer 06. 從尾到頭列印連結串列

  • 題目描述

輸入一個連結串列的頭節點,從尾到頭反過來返回每個節點的值(用陣列返回)。

示例 1:

輸入:head = [1,3,2]
輸出:[2,3,1]

限制:

0 <= 連結串列長度 <= 10000

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof

  • 分析

可使用單鏈表反轉求解:

單鏈表反轉的過程參考部落格:https://blog.csdn.net/weixin_39561100/article/details/79818949

看不太懂,debug輔助理解下:

class
ListNode: def __init__(self, x): self.val = x self.next = None class Solution: # 返回ListNode def ReverseList(self, pHead): # write code here if pHead == None or pHead.next == None: return pHead cur = pHead tmp = None newhead
= None newList = [] while cur: tmp = cur.next #tmp指向cur後面的部分 cur.next = newhead #這裡將cur.next指向了newHead,我的理解是截斷了cur後面的連結串列 newhead = cur #將截斷後的cur指向newhead cur = tmp #cur又指回原來的後面的部分 while newhead: newList.append(newhead.val) newhead
= newhead.next return newList s = Solution() l1 = ListNode(1) l1.next = ListNode(2) l1.next.next = ListNode(3) l1.next.next.next = ListNode(4) Phead = ListNode(l1) new = s.ReverseList(Phead.val) print(new)

遞迴求解:

遞迴求解真的花了我好久時間去理解。加入需要反轉的連結串列為[1,2,3,4]

遞迴的大致思路是反轉[2,3,4],成為[4,3,2],然後再將1的head指向[4,3,2]。

def ReverseList_r(self, pHead):
        if not pHead or not pHead.next:
            return pHead
        NewHead = self.ReverseList_r(pHead.next) #這裡需要好好理解下NewHead,它一開始指向了4,後來其實是一直在改變4指向的新節點,和新節點指向的更新的節點
        pHead.next.next = pHead #這裡的操作性相當於一開始pHead指向4,4指向None,這裡改變4指向pHead(相當於指回去,反轉回去這樣)
        pHead.next = None  #然後取消掉後面迴圈指向,就只讓4指向前面的3。
return NewHead

理解1:

pHead.next.next = pHead
pHead.next = None

這裡為什麼要pHead的下一個節點的下一個節點指向自身,這裡主要是為了讓節點4反轉回去指向之前的節點,然後由於這樣指了回去其實就是一個迴圈的連結串列了會陷入死迴圈,因此將pHead的下一個節點指向了None,這裡其實偷偷地將指標往前移動了,每次把next後面的指向空,每次拿進去反轉的其實只有倒數的2個節點。

理解2:

NewHead到底指向的是什麼:我的理解是一開始NewHead連結上了最後一個節點4,因此後面對節點4後面的操作就是每次修改4後面連結的節點,就是pHead.next=None之後的節點。