鍊錶的反轉是乙個很常見、很基礎的資料結構題,輸入乙個單向鍊錶,輸出逆序反轉後的鍊錶,如圖:上面的鍊錶轉換成下面的鍊錶。實現鍊錶反轉有兩種方式,一種是迴圈迭代,另外一種方式是遞迴。
第一種方式:循壞迭代
循壞迭代演算法需要三個臨時變數: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 = nonehead的向後指標的向後指標轉換成head的向後指標,依此類推。head.next.next = head.next
head.next.next.next = head.next.next
......
實現的關鍵步驟就是找到臨界點,何時退出遞迴。當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 結點的定義...