_莫相逢

导航

LeetCode 206 反转链表

题目:

反转一个单链表。

示例:

输入: 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 };

 

posted on 2019-04-19 09:47  莫晓风  阅读(94)  评论(0编辑  收藏  举报