鍊錶反轉總結

2022-06-18 04:30:12 字數 1397 閱讀 4053

遞迴反轉鍊錶

比如現在有這樣乙個鍊錶:

\(k_1\rightarrow k_2\rightarrow ... \rightarrow k_\rightarrow k_\rightarrow ... \rightarrow k_\)

若\(k_\)之後的鍊錶都已經完成了反轉,如下:

\(k_1\rightarrow k_2\rightarrow ... \rightarrow k_\leftarrow k_\leftarrow ... \leftarrow k_\)

下一步該如何操作呢?

ki->next->next = ki

因此可以據此寫出遞迴**:

class solution 

};

時間複雜度:\(o(n)\)

空間複雜度:\(o(n)\)

迭代反轉鍊錶

定義乙個prev指標作為新煉表頭指標,使用頭插法將待反轉鍊錶中的節點按順序插入到prev鍊錶中,返回。

class solution 

return prev;}};

時間複雜度:\(o(n)\)

空間複雜度:\(o(1)\)

對於鍊錶中部分節點的反轉,分為三步:

**實現:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

// 斷鏈反轉,得到反轉後的鍊錶third

listnode *tail = curr, *third = nullptr, *tmp;

while (n > 0)

// 重新連線上斷鏈

tail->next = tmp;

if (prev != nullptr) else

return head;}};

時間複雜度:\(o(n)\)

空間複雜度:\(o(1)\)

對於鍊錶反轉的題目,最簡單的辦法就是新建乙個陣列來儲存鍊錶,然後逆序地重新構建新鍊錶,但是這種做法的時間和空間開銷都比較大;更好的辦法是在原煉表上直接反轉,即前述的兩種方法:迭代頭插法與遞迴反轉,迭代頭插法效率高,而遞迴反轉的**實現非常簡潔。

在做鍊錶題的時候在紙上畫一下圖能夠使操作過程變得更清晰。

反轉鍊錶總結

description reverse a singly linked list.問題描述 反轉鍊錶。in place操作,不要新開空間 給定鍊錶的頭結點,得到反轉鍊錶的頭結點。解法一 迭代解法 尾插法 思路 直觀感覺是將鍊錶的指向全部反向,但是要先用臨時結點儲存後一結點資訊,以免反向後找不到後一節...

鍊錶 反轉鍊錶

問題 兩兩交換鍊錶中的節點 問題 k 個一組翻轉鍊錶 問題鏈結 利用棧先進後出的特性,遍歷鍊錶,將每個結點加入棧中,最後進行出棧操作,先出棧的結點指向臨近的後出棧的結點。definition for singly linked list.struct listnode class solution ...

leetcode 反轉鍊錶問題總結

第一次被問反轉鍊錶是被位元組,我沒想出來。後來在劍指offer上面看到了,我沒做出來。在leetcode和牛客上遇見,是那麼的熟悉。今天的每日一題還是思路不清晰。我意識到,我是時候寫點什麼了。希望下次遇到的時候思路清晰,一招斃命。反轉鍊錶i 反轉鍊錶ii 反轉鍊錶i是把整個鍊錶都反轉,相對來說容易一...