LeetCode206 反轉鍊錶

2021-10-19 09:08:57 字數 2067 閱讀 7457

此題涉及乙個重要概念:哨兵結點

哨兵節點廣泛應用於樹和鍊錶中,通常以偽頭、偽尾、特殊標記等形式存在。它存在的目的通常是使鍊錶永不為空、永不無頭、方便改變鍊錶結構、或實現頭部可刪等。

這道題的思路是,寫乙個迴圈使head前進的同時一步步反轉鍊錶中的元素。具體思考過程如下:

首先,給鍊錶加乙個偽頭(哨兵結點)dummy,這個結點指向原鍊錶的表頭。

然後,以鍊錶[1→2→3→4→5]為例,進行三個改變鏈的指向的操作,如下圖所示。

之後,鍊錶就變成了[2→1→3→4→5]。然後head前進,重複這三個操作。

此時,鍊錶就變成了[3→2→1→4→5]。然後head繼續前進,重複,直到迴圈結束。

這裡的箭頭大家看了最好自己畫一畫體會一下,不然不是特別好理解。

python3的**實現如下:

# definition for singly-linked list.

# class listnode:

# def __init__(self, val=0, next=none):

# self.val = val

# self.next = next

class solution:

def reverselist(self, head: listnode) -> listnode:

dummy = listnode(0) # 這裡dummy的value可以任意取,我取了0

dummy.next = head # 指向原鍊錶的頭,相當於加了乙個偽頭,這個dummy就是哨兵結點

while(head != none and head.next != none):

dnext = dummy.next

hnext = head.next

# 下面的三行**分別表示上面提到的三個操作

dummy.next = hnext

head.next = hnext.next # hnext.next是當前結點的下下個結點

hnext.next = dnext

return dummy.next

這裡有兩個點要注意一下。

迴圈裡前兩行先提前儲存了dummy指向的位置和head指向的位置,是因為在鍊錶操作的過程中,這些值都會產生變化,而我們希望用到的是變化前的值。如果全部用dummy.next來寫這個**的話,迴圈根本出不去..

初學者有時候分不清head和head.val的區別。這裡稍作解釋:head表示鍊錶中乙個結點的位置,這裡面包括了value(值)屬性和next(指向)屬性;而head.val只表示乙個數值。

最終的執行用時擊敗60%,記憶體消耗擊敗45%。

# definition for singly-linked list.

# class listnode:

# def __init__(self, val=0, next=none):

# self.val = val

# self.next = next

class solution:

def reverselist(self, head: listnode) -> listnode:

p, rev = head, none

while p:

rev, rev.next, p = p, rev, p.next

return rev

最終的執行用時擊敗82%,記憶體消耗擊敗54%。

leetcode 206 鍊錶反轉

一 題目大意 反轉乙個單鏈表,實現遞迴和非遞迴兩種形式 二 鍊錶節點 public class listnode 三,分析 1,非遞迴解決方案 最容易想到的是使用三個指標,p1,p2,p3,遍歷鍊錶事項反轉。這裡需要注意的是,p1,p2,p3的初始化,不同初始化應該考慮煉表頭的不同處理。一般的初始是...

LeetCode 206 反轉鍊錶

反轉乙個單鏈表。高階 鍊錶可以迭代或遞迴地反轉。你能否兩個都實現一遍?設定三個指標分別指向連續的三個節點,每次完成節點的反向就把三個節點同時後移,直到所有節點反轉。definition for singly linked list.struct listnode class solution ret...

LeetCode 206 反轉鍊錶

206.反轉鍊錶 反轉乙個單鏈表。輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null非遞迴解法 1.class solution object defreverselist self,head type head listnode rtype listnode res none ...