鍊錶的翻轉

2021-06-18 10:43:12 字數 1237 閱讀 8550

如何快速的實現鍊錶的翻轉,比如鍊錶a資料為

str1,str2,  str3,  str4,  str5,  str6

翻轉後則變為

str6,  str5,  str4,  str3,  str2,  str1

針對上述問題我能想到的一種辦法就是以壓棧的方式來實現,其實現思路相對較為簡單,

通過定義乙個鍊錶資料結構的資料棧,遍歷鍊錶,並將其壓棧,完成後,棧中的鍊錶資料

即為我們想要的結果了,我們只需進行出棧操作,並建立乙個新的鍊錶即可。

從敘述中可以得到,該方法需要額外的空間來儲存資料,建立堆疊以及建立乙個新的鍊錶

至少需要2n個節點空間(如有n個節點),這無疑增加了空間複雜度,此外,該演算法需要經歷一

此遍歷、一次壓棧、一次出棧以及建立乙個新的鍊錶,其時間開銷也相對較大。如何才能減少

其執行的時間以及所需的空間呢?

我們知道鍊錶的建立可以有兩種方式:頭插法和尾插法。這給了我們乙個提示,當我們在翻轉

鍊錶時,如果在遍歷鍊錶時通過頭插法將鍊錶重新插入,此時鍊錶不就是逆序了麼?此時我們

不需要增加任何節點,只需要幾個節點指標就可以完成,同時,我們只需要進行一次鍊錶的遍

歷即可以完成鍊錶的翻轉。

考慮到第一種實現方式較為複雜,在這裡就給出第二種方式的**。

#include typedef int type;

typedef struct node listnode;

void initlist(listnode* &l, type* arr, int size)

}void display(listnode* &l)

std::cout

current = first->next; // current用於儲存目前處理的節點

first->next = null; // 一定要置為null,否則可能導致迴圈

鍊錶的翻轉

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。struct listnode 方法一 建立節點指標型別堆疊,遍歷鍊錶,將指標壓棧,順次出棧,實現反轉。這個占用記憶體空間較大。listnode reverselist listnode phead 建立鍊錶list list phead if list...

鍊錶翻轉的方法

鍊錶的翻轉是程式設計師面試 現頻度最高的問題之一,常見的解決方法分為遞迴和迭代兩種。最近在複習的時候,發現網上的資料都只告訴了怎麼做,但是根本沒有好好介紹兩種方法的實現過程與原理。所以我覺得有必要好好的整理一篇博文,來幫忙大家一步步理解其中的實現細節。我們知道迭代是從前往後依次處理,直到迴圈到鏈尾 ...

分析鍊錶翻轉

鍊錶翻轉分兩部分,鍊錶整表翻轉和鍊錶部分翻轉。下面討論非遞迴的做法,遞迴的做法以後有空再說。先說鍊錶整表翻轉,核心四句話 next p.next p.next pre pre p p next 顧名思義,pre是p前面的節點,next是p後面的節點。舉個例子,下圖是乙個鍊錶節點翻轉前的狀態 上面的 ...