面試題 鍊錶的 部分 翻轉

2021-08-24 23:21:47 字數 2639 閱讀 5822

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