分析鍊錶翻轉

2021-07-11 14:07:32 字數 1607 閱讀 9048

鍊錶翻轉分兩部分,鍊錶整表翻轉和鍊錶部分翻轉。下面討論非遞迴的做法,遞迴的做法以後有空再說。。。

先說鍊錶整表翻轉,核心四句話:

next = p.next;

p.next = pre;

pre = p;

p = next;

顧名思義,pre是p前面的節點,next是p後面的節點。舉個例子,下圖是乙個鍊錶節點翻轉前的狀態:

上面的**執行之後,變成下圖:

只要重複這個過程並最後處理頭結點(1指向2的指標)就能完成鍊錶的翻轉。

有了上面的分析,再來分析鍊錶部分翻轉,假設要翻轉下面這個鍊錶3,4,5

那麼,很明顯,應當先遍歷鍊錶到3再開始翻轉。顯然,翻轉完後鍊錶的狀態是下圖:

要完成翻轉,只需把p1指向5(pre),p2指向6(p)即可。邏輯就是這樣,**如下:
public

class main

//鍊錶整表翻轉

public

static node reverse(node head)

head.next = null;

return pre;}}

//鍊錶部分翻轉

public

static node reverse(node head,int

from,int to)

node pre = head;

node p = pre.next;

node next = null;

while(i//圖例中p2指向p

ppre.next = pre;//圖例中p1指向pre

return phead.next;}}

//造鍊錶

public

static node createlist(int num)

return phead;

}public

static

void

printlist(node p) }}

在部分翻轉鍊錶的**中我設定了乙個前置節點,這樣處理頭結點比較容易,其它的應該沒什麼好解釋的了。收工。

鍊錶的翻轉

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

鍊錶部分翻轉

題目描述 給定乙個鍊錶,翻轉該鍊錶從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...

92 翻轉鍊錶

題目 思路 遍歷鍊錶,直到m位置,記錄為新的頭節點,即將開始翻轉.新增乙個pre節點,每遍歷乙個m到n之間的節點,就將它提到頭節點的前面.class solution def reversebetween self,head listnode,m int,n int listnode if not ...