翻轉鍊錶,迭代解法和遞迴解法

2021-09-24 12:57:39 字數 1829 閱讀 6662

題目:

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

時間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...