Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
之前做到 Reverse Linked List II 的時候我還納悶怎么只有二沒有一呢,原來真是忘了啊,現在才加上,這道題跟之前那道比起來簡單不少,題目為了增加些許難度,讓我們分別用迭代和遞歸來實現,但難度還是不大。我們先來看迭代的解法,思路是在原鏈表之前建立一個空的newHead,因為首節點會變,然后從head開始,將之后的一個節點移到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; } };
類似題目:
參考資料:
https://leetcode.com/problems/reverse-linked-list/
https://leetcode.com/problems/reverse-linked-list/discuss/58156/My-Java-recursive-solution
https://leetcode.com/problems/reverse-linked-list/discuss/58337/Fast-Recursive-Java-solution