題目
https://leetcode-cn.com/problems/reverse-linked-list/solution/
簡單
鏈表
我的題解
無。
題解
方法一:迭代
假設存在鏈表 1 → 2 → 3 → Ø
,我們想要把它改成 Ø ← 1 ← 2 ← 3
。
在遍歷列表時,將當前節點的 next
指針改爲指向前一個元素。由於節點沒有引用其上一個節點,因此必須事先存儲其前一個元素。在更改引用之前,還需要另一個指針來存儲下一個節點。不要忘記在最後返回新的頭引用!
方法二:遞歸
遞歸版本稍微複雜一些,其關鍵在於反向工作。假設列表的其餘部分已經被反轉,現在我該如何反轉它前面的部分?假設列表爲:n1 → … → nk-1 → nk → nk+1 → … → nm → Ø
若從節點 nk+1
到 nm
已經被反轉,而我們正處於 nk
。
n1 → … → nk-1 → nk → nk+1 ← … ← nm
我們希望 nk+1
的下一個節點指向 nk
。
所以,nk.next.next = nk
;
要小心的是 n1
的下一個必須指向 Ø
。如果你忽略了這一點,你的鏈表中可能會產生循環。如果使用大小爲 2
的鏈表測試代碼,則可能會捕獲此錯誤。
c
solution 1
迭代
T(n) = O(n)
S(n) = O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *prev = NULL;
struct ListNode *curr = head;
while (curr != NULL) {
struct ListNode *nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
solution 2
遞歸
T(n) = O(n)
S(n) = O(n)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if (head == NULL || head->next == NULL) return head;
struct ListNode *p = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return p;
}