Fork me on GitHub

leetcode之206. 反转链表

题目描述:

反转一个单链表。

示例:

1
2
3
> 输入: 1->2->3->4->5->NULL
> 输出: 5->4->3->2->1->NULL
>

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

解题思路一:

非递归

时间复杂度:$O(n)$, 空间复杂度:$O(1)$.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {

if(!head || !head->next) return head;

ListNode *p = head;
ListNode *q = head->next;
ListNode *r = head->next->next;

p->next = NULL;
while(r != NULL)
{
q->next = p;

p = q;
q = r;
r = r->next;

}

q->next = p;

return q;
}
};

解题思路二:

递归

时间复杂度:$O(n)$, 空间复杂度:$O(1)$.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {

if(!head || !head->next) return head;

ListNode *p = reverseList(head->next);

head->next->next = head;
head->next = NULL;

return p;

}
};