遞迴反轉鍊錶
比如現在有這樣乙個鍊錶:
\(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是把整個鍊錶都反轉,相對來說容易一...