反轉鍊錶的演算法實現

2021-08-28 18:50:06 字數 972 閱讀 8013

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

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

struct listnode 

};

分析:

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

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

反轉前:

反轉後:

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

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

演算法實現如下:

listnode* reverselist(listnode* phead)

return preversedhead;

}

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

listnode* reverselist(listnode* phead)     

root->next=pre;

return root;

}

反轉鍊錶的演算法實現

鍊錶是面試裡面經常涉及到的考點,因為鍊錶的結構相比於hashmap hashtable concurrenthashmap或者圖等資料結構簡單許多,對於後者更多面試的側重點在於其底層實現。比如hashmap中entry等操作 如何擴容 容量的設定等。鍊錶的考察更側重於 的書寫和思路的形成。雖然說,鍊...

演算法 反轉鍊錶

編寫帶 實現反轉單鏈表。如 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...