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 };