2023年08月09日 21:43:37
問題:給出乙個單鏈表(不帶頭節點)和乙個數k,請翻轉此單鏈表?
例如:1->2->3->4->5 k = 0; 翻轉過後:1->2->3->4->5
1->2->3->4->5 k = 2; 翻轉過後:2->1->4->3->5
1->2->3->4->5 k = 10; 翻轉過後:5->4->3->2->1
在討論鍊錶的『部分』翻轉問題之前,先回顧一下鍊錶的逆置問題,如何將乙個鍊錶進行逆置?我們以前採用的方式是『摘節點頭插』的方法。假設右鍊錶1->2->3->4->5,新建乙個節點指標newhead=null,用cur指標指向鍊錶的頭節點,將摘下的節點用tmp進行儲存,然後將tmp和newhead進行連線,將newhead指向tmp的位置上,如此迴圈直到cur為null結束。
■下面是『摘節點頭插』的簡單圖示:
■下面是詳細的實現:
//鍊錶節點的結構
struct node
;
void reverse(node* list)
node* cur = list;
node* newhead = null;
while (cur)
}
通過上面的解釋,讀者應該對鍊錶的逆置應該不會陌生了,下面就還看一下鍊錶的『部分』翻轉的問題:
鍊錶的『部分』翻轉,它和鍊錶的逆置還是不一樣的,對於給定的k,其實就是沒此逆置k個節點,然後連線上後面翻轉過後的k個節點,若最後剩餘的不足k個節點,同樣也對其進行翻轉,然後進行連線。所以我們可以借助一下『摘節點頭插』的方式,分部分進行『摘節點頭插』。
假設1->2->3->4->5,k = 2; 即就是將1和2進行翻轉,3和4進行翻轉,5進行翻轉,然後將1和2翻轉後的結果與3和4翻轉後的結果和5翻轉後的結果進行連線,得到2->1->4->3->5.
在完成**之前,先考慮鍊錶若為空的情況,針對這個問題,如果k =0/1時的情況,k若大於鍊錶節點的總個數又是什麼情況?當鍊表為空時,可以直接返回,或者k=0/1時,就不需要對其進行翻轉,也可以直接進行返回。若k大於鍊錶節點的總個數,即就是相當於對鍊錶進行逆置。
在完成鍊錶『部分』的翻轉,需要sectionhead(指向『部分』的頭節點)、sectiontail(指向『部分』的尾節點)、cur(指向整個鍊錶)、newhead(指向翻轉完成的煉表頭節點)、prevsectiontail(指向這一部分之前部分的尾節點)、tmp(用來做中間儲存節點的指標)這幾個節點指標,sectionnum用來標識翻轉的是第幾部分。下面是『部分』翻轉的簡單圖示:
■下面是『部分』翻轉的實現**:
node* rolloverlist(node* list, int k)
node* cur = list; //指向鍊錶的頭節點
node* newhead = null; //指向逆置後的鍊錶
node* sectionhead = null; //指向需要逆置部分的頭節點
node* sectiontail = null; //指向需要逆置部分的尾節點
node* prevsectiontail = null; //指向部分尾節點的指標
int sectionnum = 0; //用來標記鍊錶翻轉到第幾部分
while (cur)
++sectionnum; //統計逆置了幾部分
//如果sectionnum為1時,逆置的部分為第一部分,就應該確定逆置後的鍊錶的頭節點
if (sectionnum == 1)
else //證明逆置的為鍊錶後面的部分,需要將後面的部分和前面的部分進行連線起來
}
//出迴圈cur == null
sectiontail->_next = null;
return newhead;
}
本文出自 「無心的執著」 部落格,請務必保留此出處
鍊錶部分翻轉
題目描述 給定乙個鍊錶,翻轉該鍊錶從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...
鍊錶的面試題
1 比較順序表和煉表的優缺點,它們分別在什麼場景下使用?1 順序表支援隨機訪問,單鏈表不支援隨機訪問。2 順序表插入 刪除資料效率很低,時間複雜度為o n 除尾插和尾刪 單鏈表插入 刪除效率更高,時間複雜度為o 1 3 順序表的cpu高速緩衝效率更高,單鏈表cpu高速緩衝效率低。2 列印單向鍊錶 v...
鍊錶的面試題
slist.h include include include typedef int datatype typedef struct listnode node,pnode 生成乙個新結點 pnode buyslistnode datatype data 列印鍊錶 void printslist ...