1. 程式人生 > 實用技巧 >LeetCode206 反轉連結串列

LeetCode206 反轉連結串列

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?

遞迴:

遞迴到尾節點,然後往回;每次都是返回尾結點。對於每個遞迴棧的head,將head->next->next設定為自己,即把下一個的下一個設為自己;再把自己的next設定為nullptr,否則頭部的next還是指向原來得下一個,會出錯

迭代:

一樣的思想,只是要提前儲存下一個節點。

 1 /**
 2  * Definition for singly-linked list.
3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* reverseList(ListNode* head) { 12 return iterate(head); 13 } 14 15 ListNode* iterate(ListNode* head){ 16
if(head==nullptr) 17 return head; 18 ListNode* prev=head; 19 head=head->next; 20 prev->next=nullptr; 21 while(head!=nullptr){ 22 ListNode* save=head->next; 23 head->next=prev; 24 prev=head; 25 head=save;
26 } 27 return prev; 28 } 29 30 ListNode* recursive(ListNode* head){ 31 if(head==nullptr || head->next==nullptr){ 32 return head; 33 } 34 ListNode* ret=recursive(head->next); 35 head->next->next=head; 36 head->next=nullptr; 37 return ret; 38 } 39 };