python演算法題 鍊錶反轉詳解 python

2021-10-01 18:52:20 字數 1860 閱讀 6598

鍊錶的反轉是乙個很常見、很基礎的資料結構題,輸入乙個單向鍊錶,輸出逆序反轉後的鍊錶,如圖:上面的鍊錶轉換成下面的鍊錶。實現鍊錶反轉有兩種方式,一種是迴圈迭代,另外一種方式是遞迴。

第一種方式:循壞迭代

循壞迭代演算法需要三個臨時變數:pre、head、next,臨界條件是鍊錶為none或者鍊錶就只有乙個節點。

# encoding: utf-8

class node(object):

def __init__(self):

self.value = none

self.next = none

def __str__(self):

return str(self.value)

def reverse_loop(head):

if not head or not head.next:

return head

pre = none

while head:

next = head.next # 快取當前節點的向後指標,待下次迭代用

head.next = pre # 這一步是反轉的關鍵,相當於把當前的向前指標作為當前節點的向後指標

pre = head # 作為下次迭代時的(當前節點的)向前指標

head = next # 作為下次迭代時的(當前)節點

return pre # 返回頭指標,頭指標就是迭代到最後一次時的head變數(賦值給了pre)

測試一下:

if __name__ == '__main__':

three = node()

three.value = 3

two = node()

two.value = 2

two.next = three

one = node()

one.value = 1

one.next = two

head = node()

head.value = 0

head.next = one

newhead = reverse_loop(head)

while newhead:

print(newhead.value, )

newhead = newhead.next

輸出:

第二種方式:遞迴

遞迴的思想就是:

head.next = none

head.next.next = head.next

head.next.next.next = head.next.next

......

head的向後指標的向後指標轉換成head的向後指標,依此類推。

實現的關鍵步驟就是找到臨界點,何時退出遞迴。當head.next為none時,說明已經是最後乙個節點了,此時不再遞迴呼叫。

def reverse_recursion(head):

if not head or not head.next:

return head

new_head = reverse_recursion(head.next)

head.next.next = head

head.next = none

return new_head

python演算法題 鍊錶反轉詳解

鏈程式設計客棧表的反轉是乙個很常見 很基礎的資料結構題,輸入乙個單向鍊錶,輸出逆序反轉後的鍊錶,如圖 上面的鍊錶轉換成下面的鍊錶。實現鍊錶反轉有兩種方式,一種是迴圈迭代,另外一種方式是遞迴。第一種方式 循壞迭代 循壞迭代演算法需要三個臨時變數 pre head next,臨界條件是鍊錶為none或者...

Leet Code演算法題(反轉鍊錶)

c 解題思路,如何反轉乙個鍊錶 將head放到最後一位 head next作為head 重複操作 看 首先這是乙個鍊錶 定義幾個指標 listnode prep null,curp head,nextp head next 然後執行 curp next prep 將head放到最後 prep cur...

演算法 反轉鍊錶

編寫帶 實現反轉單鏈表。如 1,2,3,4,5 變為 5,4,3,2,1 要求空間複雜度為o 1 先直接給出乙份完整的 可以直接執行。c include include include typedef int datatype 鍊錶持有的資料的型別 typedef struct node 結點的定義...