關於鍊錶的結構請參考:
《劍指offer》預備知識-鍊錶與二叉樹
我會直接呼叫裡面定義的這個鍊錶的類(但不呼叫大部分的類方法,不然就是出貓了→_→)。
offer05的要求是,給出和乙個鍊錶,要求反向輸出。這裡先給出乙個[1,2,3,4,5]的鍊錶
from linklist import listnode, linklist
l = linklist(
)for i in
range(1
,6,1
):node = l.head
如果對資料結構有了解的話,就會第一時間考慮乙個棧。請把棧想象成乙個量筒,然後我們往裡面裝桌球(元素);當我們要取桌球的時候,就會有先進後出,後進先出的情況。這很符合題目的要求。因此用乙個棧把煉表裡的元素記下來,然後輸出即可。
# offer05-solution
defprintlistfromtailtohead
(listnode):if
not listnode:
return
res =
while listnode.
next
isnot
none
: listnode = listnode.
next
print
(res[::
-1])
# res相當於乙個棧,先進後出,後進先出
return
printlistfromtailtohead(node)
offer21直接要求反轉鍊錶。
# offer21-solution
defreverselist
(phead)
: pre =
none
# 前乙個
now = phead # 現在
rear =
none
# 後乙個
while now:
rear = now.
next
# 後指標向後移一位
now.
next
= pre # now指向前指標
ifnot rear:
# now已經是原鍊錶尾部,現鍊錶頭部
return now
pre = now # 前指標向後移一位
now = rear # 現指標向後移一位
reverselist(node)
我使用的是一種三指標的形式。鍊錶類的題目,一定要把圖畫出來,這種三指標的形式迭代的方法如下。
鍊錶類的問題還有很多,這兩個應該是比較典型的逆序問題。其中offer21會相對較難,自己搞的時候要上圖理解。
參考:【**解析】反轉乙個單鏈表
劍指offer 鍊錶
單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...
劍指offer 鍊錶
鍊錶 鍊錶是一種動態資料結構 struct listnode 往鍊錶的末尾新增乙個節點的c 程式如下 void addtotail listnode phead,int value 注意第乙個引數phead是乙個指向指標的指標。當我們往乙個空鍊錶插入乙個結點時,else pnode m pnext ...
劍指offer 鍊錶
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。思路1 遞迴版 class solution 找到當前節點與下乙個節點不重複的點,從不重複的點開始遞迴 return deleteduplication phead next else 思路2 非遞迴版 ...