《劍指offer》05 21 鍊錶反向輸出與反轉

2021-10-09 18:41:10 字數 1525 閱讀 8696

關於鍊錶的結構請參考:

《劍指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 非遞迴版 ...