面試題 單鏈表反轉

2021-06-29 16:21:24 字數 1524 閱讀 2533

問題:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。

一 非遞迴演算法:

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

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

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

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

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

**:

listnode* reverselist(listnode*phead) //第一種方法

return preversedhead;//

返回反轉煉表頭指標。

}

listnode* reverselist2(listnode*phead)//第二種方法:比較簡潔的演算法

return pprev;//

返回反轉煉表頭指標。

}

測試**:
#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

}void

main()

二 遞迴演算法

在遞迴演算法中的做法是:

1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼

2反轉這兩個節點

3倒數第三個和第四個節點重複執行步驟2

其中注意,鍊錶是以節點後繼為null結束的,在更改指標的過程中要把改後的節點後繼改為null

**:void

inversion_recursion(listnode* p,listnode* head)  

inversion_recursion(p->next,head);  

p->next->next=p;//反轉節點

p->next=null;//第乙個節點反轉後其後繼應該為null

}

鏈表面試題 反轉單鏈表

反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null解決方案 頭插法開闢新鍊錶並逐個讀取舊鍊錶,頭插進新鍊錶,這樣新的鍊錶與原鍊錶的結構就是反的,需要借助輔助空間 definition for singly linked list.struct listnod...

開心IT面試題 單鏈表排序 反轉

一 單鏈表排序 仿照基於陣列的氣泡排序演算法 node sorting linklist node node node result int temp 0 int len length linklist node result node for int j 0 j len j result resu...

鏈式儲存面試題 單鏈表反轉

出現位置 第一輪基礎類筆試或技術一面 難度係數 中 面試題目 實現乙個單鏈表的反轉。例如 10 9 8 7 6 5 4 3 2 1 反轉後應該為 1 2 3 4 5 6 7 8 9 10 要求10分鐘內寫出 注意 風格及時間複雜度 空間複雜度。考點分析 1 基本概念 鍊錶基礎,規範問題,健壯性問題。...