題目要求我們分別用迭代和遞歸分別來實現。
感謝星球振哥的動態圖:
- 迭代的思路:在原鏈表之前建立一個新的newHead,然後從頭結點開始,將之後的一個結點移到newHead之後,重複此操作,直到head成爲尾結點爲止。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *newHead = NULL;
while (head) {
ListNode *t = head->next;
head->next = newHead;
newHead = head;
head = t;
}
return newHead;
}
};
- 遞歸的思路:不斷的進入遞歸函數,直到head指向倒數第二個節點,因爲head指向空或者是最後一個結點都直接返回了,newHead則指向對head的下一個結點調用遞歸函數返回的頭結點,此時newHead指向最後一個結點,然後head的下一個結點的next指向head本身,這個相當於把head結點移動到末尾的操作,因爲是回溯的操作,所以head的下一個結點總是在上一輪被移動到末尾了,但head之後的next還沒有斷開,所以可以順勢將head移動到末尾,再把next斷開,最後返回newHead。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode *newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
};