輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。
迭代法:
畫圖模擬,發現需要三個指標來完成反轉,需要儲存下乙個節點,因為反轉後會丟失和後面節點的連線。注意頭節點的next要變成none(尾節點),返回節點是原來的尾節點。
遞迴法:
新建乙個頭節點指向尾節點的,每次遞迴返回值不變。每次遞迴傳入的節點phead是此次要加入反轉鍊錶的節點,phead.next指向的是已經反轉過的鍊錶的最後乙個節點,所以把phead賦值給phead.next.next,成功反轉該節點。不要忘記把phead.next設為none,結束鍊錶,尾節點。
# 頭節點變尾節點
while pafter !=
none
: p.
next
= pahead
pahead = p
p = pafter
pafter = pafter.
next
p.next
= pahead
return p
defreverselist
(self, head: listnode)
-> listnode:
pre =
none
cur = head
while cur !=
none
: ne = cur.
next
cur.
next
= pre
pre = cur
cur = ne
return pre
defreverselist
(phead)
:if phead ==
none
or phead.
next
==none
:return phead
else
: newhead = listnode(0)
newhead = reverselist(phead.
next
) phead.
next
.next
= phead
phead.
next
=none
return newhead
對第m-n個節點反轉,其餘節點不變
虛頭節點便於m=1的情況下的反轉
找到要反轉的前乙個節點pre
找到第乙個要反轉的節點cur
找到當前要反轉的節點ne
反轉後的最後乙個節點,與未反轉的節點連線
當前反轉節點作為反轉後的頭節點,next指向之前的頭節點
更新反轉後的頭節點
(這裡的頭節點指待反轉鍊錶的頭節點,不是整個鍊錶的頭節點)
def
reversebetween
(self, head: listnode, m:
int, n:
int)
-> listnode:
if head ==
none
:return
none
dummyhead = listnode(0)
dummyhead.
next
= head
pre = dummyhead
for _ in
range
(m-1):
pre = pre.
next
# pre指向反轉的前乙個節點,用來連接待反轉的最後乙個節點
cur = pre.
next
# cur指向第乙個要反轉的節點,是反轉後的最後乙個節點
for _ in
range
(n-m)
: ne = cur.
next
#保留下乙個節點資訊,ne是此次要和cur反轉的節點
cur.
next
= ne.
next
#反轉後的最後乙個節點,與未反轉的節點連線
ne.next
= pre.
next
#注意這裡不能直接等於cur,因為cur不變,一直指向第乙個要反轉的節點,所以要通過pre.next去找反轉後的頭節點
pre.
next
= ne #更新反轉後的頭節點
劍指Offer 24 反轉鍊錶
定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。例 輸入 1 2 3 4 5 none 輸出 5 4 3 2 1 none 雙指標遍歷鍊錶,將當前節點的next設為前乙個節點。注意儲存當前節點的next來遍歷。時間複雜度 o n 空間複雜度 o 1 def reverse l...
劍指offer24 反轉鍊錶
定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。樣例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null思路 初始化乙個新的頭節點new head,然後用尾插法把原始鍊錶中的結點插入新的頭節點。最後return new head next.acwing 3...
劍指offer24 反轉鍊錶
定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出轉換後的頭結點。首先,從題目中可得知為單鏈表結構,只有指向下乙個元素的指標。而要完成整個鍊錶的反轉則需要將所有next指標進行反轉。定義3個指標,分別指向當前遍歷的節點 它的前乙個節點以及後乙個節點。pnode ppre pre pnode phe...