题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路:
1、迭代方法,从前往后扫描一遍,以此改变当前指针p的指向,其中用到三个指针,当前指针p,上一指针last,头指针pHead。
2、递归方法,一层一层的递归到最后一个节点,再以此返回改变指向。
代码:
解法1:迭代
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 if(!head || !head->next) 13 return head; 14 ListNode* pHead = head; 15 ListNode* p = pHead->next; 16 ListNode* pre = (ListNode*)malloc(sizeof(ListNode)); 17 pre->next = head; 18 ListNode* last = head; 19 while(p) 20 { 21 last->next = p->next; 22 p->next = pHead; 23 pHead = p; 24 p = last->next; 25 } 26 return pHead; 27 } 28 };
解法2:递归
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* reverse(ListNode* pHead, ListNode* last) 12 { 13 ListNode* ans; 14 if(pHead->next != NULL) 15 ans = reverse(pHead->next, pHead); 16 else 17 ans = pHead; 18 pHead->next = last; 19 return ans; 20 } 21 ListNode* reverseList(ListNode* head) { 22 if(!head || !head->next) 23 return head; 24 ListNode* ans; 25 ans = reverse(head, NULL); 26 return ans; 27 } 28 };