鍊錶 翻轉鍊錶 還沒看懂

2021-10-06 23:03:25 字數 1663 閱讀 4614

題目

定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。

示例:

輸入: 1->2->3->4->5->null

輸出: 5->4->3->2->1->null

限制:

0 <= 節點個數 <= 5000

思路:

思路一:利用外部空間

新建乙個列表,遍歷鍊錶的同時將鍊錶儲存到列表中

然後使用pop將鍊錶從後往前彈出,然後達到反轉鍊錶的目的。

class

solution

:def

reverselist

(self, head):if

not head:

return

none

res =

#定義列表,遍歷鍊錶的同時將其存入列表

while head.

next

: head = head.

next

# 此時head指向列表的最後乙個值

#定義乙個新的temp作為新的頭指標,將其指向列表的最後乙個值,準備進行pop操作

temp = head

#對列表進行彈出操作,形成乙個新的鍊錶

while res:

node = res.pop(

) node.

next

= temp.

next

temp.

next

= node

temp = node

return head

方法二:

思路

申請兩個指標,第乙個指標叫 pre,最初是指向 null 的。

第二個指標 cur 指向 head,然後不斷遍歷 cur。

每次迭代到 cur,都將 cur 的 next 指向 pre,然後 pre 和 cur 前進一位。

都迭代完了(cur 變成 null 了),pre 就是最後乙個節點了。

動畫演示如下:

class solution(object):

def reverselist(self, head):

if not head:

return

# 需要兩個指標同時移動來對每兩個節點之間的方向進行轉向處理

pre_node = none

cur_node = head

# 遍歷整個鍊錶

while cur_node:

# 因為要斷開當前節點跟下個節點的連線,這樣就無法通過next指標找到下個節點了

# 所以需要使用乙個臨時變數來儲存當前節點的下個節點

tmp = cur_node.next

# 斷開當前節點跟下個節點的連線,使其跟上個節點進行連線,這樣next的方向就改變了

cur_node.next = pre_node

# 同時移動兩個指標,以便進行下乙個節點的反向

pre_node = cur_node

cur_node = tmp

return pre_node

鍊錶的翻轉

如何快速的實現鍊錶的翻轉,比如鍊錶a資料為 str1,str2,str3,str4,str5,str6 翻轉後則變為 str6,str5,str4,str3,str2,str1 針對上述問題我能想到的一種辦法就是以壓棧的方式來實現,其實現思路相對較為簡單,通過定義乙個鍊錶資料結構的資料棧,遍歷鍊錶,...

分析鍊錶翻轉

鍊錶翻轉分兩部分,鍊錶整表翻轉和鍊錶部分翻轉。下面討論非遞迴的做法,遞迴的做法以後有空再說。先說鍊錶整表翻轉,核心四句話 next p.next p.next pre pre p p next 顧名思義,pre是p前面的節點,next是p後面的節點。舉個例子,下圖是乙個鍊錶節點翻轉前的狀態 上面的 ...

鍊錶部分翻轉

題目描述 給定乙個鍊錶,翻轉該鍊錶從m到n的位置。要求直接翻轉而非申請新空間。如 給定1 2 3 4 5,m 2,n 4,返回1 4 3 2 5。假定給出的引數滿足 1 m n 鍊錶長度。時間複雜度為o n 以下為 include include typedef struct snode snode...