面試題16 反轉鍊錶

2021-09-08 16:10:01 字數 1234 閱讀 3989

題目:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。
假設有鍊錶a->b->c->d->e->f->g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為:af->g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣d跟e之間存在了斷裂。我們如果要實現鍊錶的反轉,會有以下幾個重要步驟:

d->e變為d->c,指標反轉

指標往後移動乙個,操作下乙個結點e

結合1.2我們發現需要操作3個指標,分別是c,d,e。

因此可以考慮儲存c/d/e三個結點的指標,通過這三個結點的指標實現反轉。

**例項:

#include#include

#include

using

namespace

std;

//鍊錶結構

struct

listnode;//

建立乙個鍊錶結點

listnode* createlistnode(int

value)

//遍歷鍊錶中的所有結點

void printlist(listnode*phead)

cout

<

往鍊錶末尾新增結點

/*注意這裡phead是乙個指向指標的指標,在主函式中一般傳遞的是引用。

因為如果要為鍊錶新增結點,那麼就會修改鍊錶結構,所以必須傳遞引用才能夠儲存修改後的結構。

*/void addtotail(listnode** phead,int

value)

else

}listnode* reverselist(listnode*phead)

return preversedhead;//

返回反轉煉表頭指標。

}void

main()

執行結果:

11 2 3 4 5 6 7

7 6 5 4 3 2 1

發現有一種更加簡潔的寫法,就是不需要preversedhead指標,從上述程式我們可以看出來preversedhead指標只是單純的用來儲存反轉鍊錶的頭指標,但是pprev和pnode指標其實就包含反轉鍊錶的頭指標,因此我們沒有必要單獨定義乙個頭指標來儲存。修改後的函式如下所示:

listnode* reverselist2(listnode*phead)

return pprev;//

返回反轉煉表頭指標。

}

面試題16 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...

面試題16 反轉鍊錶

題目 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。思路 設定三個指標p q temp,p用來指向當前結點,q用來指向當前結點的前乙個結點,temp指向當前結點的下乙個結點,遍歷鍊錶的結點時,先儲存當前結點p的下乙個結點到temp,然後讓當前結點的next指向前乙個結點p,...

面試題16 反轉鍊錶

題目 反轉鍊錶。輸入鍊錶的頭結點,反轉輸出反轉後鍊錶的頭結點。這種鍊錶操作的題之前做過,還專門寫過鍊錶反轉的東東。咋一看,覺得這用遞迴不so easy嗎。結果,papa打臉了,寫了半個多小時才出來,面試肯定就掛了。都要哭了,寫一萬遍都不會啊。先用遞迴實現 struct listnode class ...