鍊錶翻轉分兩部分,鍊錶整表翻轉和鍊錶部分翻轉。下面討論非遞迴的做法,遞迴的做法以後有空再說。。。
先說鍊錶整表翻轉,核心四句話:
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 ...