LeetCode206 反轉連結串列
阿新 • • 發佈:2020-07-21
反轉一個單鏈表。
示例:
輸入: 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){ 16if(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 };