反轉鍊錶的演算法實現

2021-08-24 23:21:47 字數 1287 閱讀 3271

鍊錶是面試裡面經常涉及到的考點,因為鍊錶的結構相比於hashmap、hashtable、concurrenthashmap或者圖等資料結構簡單許多,對於後者更多面試的側重點在於其底層實現。比如hashmap中entry等操作、如何擴容、容量的設定等。鍊錶的考察更側重於**的書寫和思路的形成。雖然說,鍊錶的結構簡單,但是涉及到指標的操作,容易引申出一些挑戰性的考題,其中也牽涉到諸多小的細節的考慮,更能看出**書寫的能力和功底。

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

下面給出了鍊錶結點的定義:

1 struct listnode 

7 };

分析:鍊錶前後元素的關聯就是通過指標實現的,每個鍊錶都有乙個next指標指向下乙個結點,末尾的節點的next域則置null;

反轉鍊錶就是要求修改指標的指向。下面的圖就是反轉前和反轉後的效果。

反轉前:

反轉後:

下面來談談如何對鍊錶進行反轉。

假設我們現在正在對結點v進行反轉操作,即原來結點u的next域指向v(圖中已經調整完畢,現在指向前乙個結點),v的next域指向w。現在要做的是將v的next域指向u。從圖中我們可以看出,當把v的next指標指向u的同時,原先指向的w就已經無法被正常的訪問到了,為了避免「斷鏈」,我們必須在指標更改指向之前,儲存修改結點的下一結點。同時我們也必須儲存上乙個結點,因為next域即將修改指向該結點。因此定義三個指標,分別指向當前遍歷的結點,前乙個結點和後乙個結點。

演算法實現如下:

1 listnode* reverselist(listnode* phead)

2 18

19 return preversedhead;

20 }

當然,上面的原始碼中用到了四個指標,看完原始碼就會發現和上面分析的原理並沒有相悖。或者下面這樣也是可以的,兩者的思路一致,沒有差別。只不過下面的**必須注意一點,跳出while迴圈的時候,最後乙個結點的next域別忘記指向前乙個結點,否則就會導致「斷鏈」。

1     listnode* reverselist(listnode* phead)     

12 root->next=pre;

13 return root;

14 }

分類: algorithm

反轉鍊錶的演算法實現

題目 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。下面給出了鍊錶結點的定義 struct listnode 分析 鍊錶前後元素的關聯就是通過指標實現的,每個鍊錶都有乙個next指標指向下乙個結點,末尾的節點的next域則置null 反轉鍊錶就是要求修改指標的指向。下面的圖...

演算法 反轉鍊錶

編寫帶 實現反轉單鏈表。如 1,2,3,4,5 變為 5,4,3,2,1 要求空間複雜度為o 1 先直接給出乙份完整的 可以直接執行。c include include include typedef int datatype 鍊錶持有的資料的型別 typedef struct node 結點的定義...

演算法 鍊錶反轉

題目 分別實現反轉單向鍊錶和反轉雙向鍊錶的函式。要求如果鍊錶長度為n,時間複雜度要求為o n 額外空間 複雜度要求為o 1 反轉單向鍊錶 class node 反轉單向鍊錶 param head 煉表頭節點 return private static node reverselist node he...