題目:
輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。
時間o(n),空間o(1)
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:# 返回listnode
defreverselist
(self, phead)
:# write code here
ifnot phead:
return phead
p = phead
q = p.
next
p.next
=none
#摘掉頭
while q !=
none
: t = q.
next
#記錄下乙個元素
q.next
=p #新摘掉的元素放在p前面
p=q #更新頭指標p
q=t #繼續原煉表中下乙個元素
return p
主要是摘頭,插頭的邏輯關係要搞清楚,頭腦不清就容易出錯。t和q指標的移動,一定是t先於q一步
時間o(n), 空間o(n)
遞迴版本稍微複雜一些,其關鍵在於反向工作。假設列表的其餘部分已經被反轉,現在我該如何反轉它前面的部分?假設列表為:n1 → … → nk-1 → nk → nk+1 → … → nm → ø
若從節點 nk+1 到 nm 已經被反轉,而我們正處於 nk。
n1 → … → nk-1 → nk → nk+1 ← … ← nm
我們希望 nk+1 的下乙個節點指向 nk。
所以,nk.next.next = nk;
要小心的是 n1 的下乙個必須指向 ø 。否則鍊錶中可能會產生迴圈。
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
reverselist
(self, head: listnode)
-> listnode:
''' 逆置後最後乙個元素為頭結點,故先走到最後乙個元素,記錄該元素,最後返回他作為頭指標
中間執行鍊錶逆置的步驟:對鍊錶中除了最後乙個元素的任意兩個元素(p, p.next)其逆置過程
為p.next.next = p, p.next = none
只有兩個元素時煉表逆置過程為:p.next.next = p; p.next = none
'''defreverse
(p: listnode)
:if p ==
none
or p.
next
==none
:return p
q = reverse(p.
next
)
p.next
.next
= p p.
next
=none
return q
return reverse(head)
反轉鍊錶的不同解法
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 如題,一上來先用最好理解的方法 依此將後一節點鏈結到最前面。具體邏輯是 將原本的頭節點指向將要被放到頭節點的節點的下乙個節點,然後將p節點放到初始節點了前面,然後更新初始節點,再更新p節點 class so...
日拱一卒 鍊錶 鍊錶反轉(遞迴解法)
上篇我們主要介紹鍊錶反轉的原地反轉解法。除此以外,是否還有其他解法?當然,今天就來看看鍊錶反轉的遞迴解法。遞迴,字面意思,有 遞 也有 歸 拿我們經常聽到的斐波那契數列來說,公式如下 f n f n 1 f n 2 f 1 1,f 2 1 現在比如求解f 5 的值,按照公式,可以展開為f 5 f 4...
翻轉鍊錶(非遞迴)
1.問題描述 給出乙個鍊錶,翻轉鍊錶,返回翻轉後鍊錶的頭結點 2.我們也可以使用非遞迴的方式來進行翻轉鍊錶,首先遍歷鍊錶,使用乙個指標pre記錄當前節點的前乙個節點,使用當前節點的next指向前乙個節點pre,即下乙個元素的指標next指向前乙個元素pre那麼就實現了鍊錶的翻轉 這裡特別要注意的是p...