對遇到的經典鍊錶問題思路進行乙個總結:
1、給定乙個單鏈表的結點指標,在o(1)時間內刪除這個節結點(非尾結點)class listnode:
def __init__(self, x):
self.val = x
self.next = none
【思路】:確保當前結點不是none, 在此基礎上進行後續處理:a)設定乙個新結點為當前結點的後乙個結點。b)將新設定結點的資料賦值給當前結點。c)當前結點指向新設定結點的next結點
2、給定乙個單鏈表,輸出鍊錶的轉置鍊錶def deletenode(phead, cur):
if cur == none or cur.next == none: # 確保當前結點非none,非尾結點
return
pre = cur.next
cur.val = pre.val
cur.next = pre.next
return phead
鍊錶的轉置可以檢視這篇文章:
3、求鍊錶的倒數第k個節點
【思路】:首先判斷鍊錶的長度,判斷是否有k個結點。當存在多餘k個結點的時候,就用到了鍊錶解決方案中經常使用的方法【運用兩個指標,一前一後】。讓乙個鍊錶先運動k步,然後同時向後運動,當先運動的指標結點為none的時候,後運動的指標對應的鍊錶結點就是所求的倒數第k個結點。
5、判斷單鏈表是否存在環class solution:
def findkthtotail(self, head, k):
# write code here
# 第一遍:先計算總共有多少個結點。第二步:兩個指標,第乙個指標先移動k步,當先移動的指標到達最後時,後移動的指標所指的節點就是所求的結點
if not head:
return head
count = 0
pre = head
while pre:
count += 1
pre = pre.next
if count4、求鍊錶的中間結點。【節點數量為奇數時返回中間結點,偶數時返回中間兩個中的任意乙個】
【思路】:1)求鍊錶的長度,然後計算中間結點的位置。從頭開始運動到中間結點的位置。2)另一種方法同樣是運用【兩個指標,一快一慢】,乙個指標每次運動兩步,另乙個指標每次運動一步。當快指標指向的結點為none,或者快指標結點的next結點為none時,慢指標指向的結點為中間結點。
def findmidnode(self, phead):
if (phead == none):
return none
fast = slow = phead
while (fast and fast.next):
fast = fast.next.next
slow = slow.next
return slow
【思路】:這題還是使用兩個指標變數,fast指標每次向前運動兩個結點,slow指標每次向前運動乙個結點。如果fast指標結點為none,或者fast指標結點的next結點為none,則不存在環。否則由於fast指標運動的快,經過若干圈之後【具體多少圈不確定,和鍊錶的結構有關】,fast和slow會指向的同一結點。
6、找到單鏈表的入口結點【是否有環,有環時求入口結點】def hascycle(self, phead):
"""判斷鍊錶是否存在環"""
fast = slow = phead
while (fast != none and fast.next != none):
fast = fast.next.next
slow = slow.next
if (fast == slow):
return true
return false
【思路】:可以根據題目5判斷是否只存在環;存在環的時候,假設入口結點與初始結點的距離為l1,相遇結點與入口結點的距離為l2。fast結點每一次走兩步,slow結點每一次走一步。fast走的路程是slow結點路程的兩倍。假設slow運動了n步,我們可以據此寫出路程方程組:
l1 + l2 = n
l1 + l2 + k*c = 2*n (k表示fast在趕上slow的過程中多走的環的圈數,c表示環的長度)
由上面的方程可以得出k*c = n,這時候令fast指向phead結點。然後fast和slow以每次一步的速度運動n次。我們可以知道fast結點剛好運動到相遇的結點,而slow結點運動n步(k*c)之後也是運動到相遇的結點。這一次,fast和slow都是每次一步的速度運動的,所以從入口結點到相遇的結點,fast和slow都會指向同乙個結點。即這一次,兩個結點第一次相遇的結點為環的入口結點。
7、判斷兩個無環單鏈表是否相交def firstnodeofcycle(self, phead):
"""find the first node of the cycle of the listnode"""
if (phead == none or phead.next == none):
return none # 乙個節點和none都不可能構成環
fast = slow = phead
while (fast != none and fast.next != none):
fast = fast.next.next
slow = slow.next
if (fast == slow):
break
if (fast != slow): # 鍊錶沒有環
return none
fast = phead # 快指標指向開始結點
while (fast != slow): # 每次向後運動乙個結點
fast = fast.next
slow = slow.next
return fast
【思路】:兩個無環單鏈表如果相交的話,那麼從交點開始到最後乙個結點都相等。我們可以判斷兩個鍊錶的最後乙個結點是否相等來判斷兩個無環鏈表是否相交。
def interofthelistnode(self, phead1, phead2):
# 判斷兩個無環單鏈表是否相交
if (phead1 == none or phead2 == none):
return false
while (phead1.next):
phead1 = phead1.next
while (phead2.next):
phead2 = phead2.next
if (phead1 == phead2):
return true
else:
return false
python鍊錶指標的理解 python描述 鍊錶
單鏈表結構 鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。對於python來說指標...
鍊錶問題總結
鍊錶問題總結 求煉表中節點的個數 unsigned int getlenthlist listnode head unsigned int length 0 listnode pcurrent head while pcurrent null return length 單鏈表的反轉 從頭到尾遍歷每...
鍊錶 鍊錶環問題總結
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...