[AcWing]35. 反转链表

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

思考题:

  • 请同时实现迭代版本和递归版本。

数据范围

链表长度 [0,30]

样例

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

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

算法思想

先分析理想情况

image-20240503205906942

分析较为苛刻的情况

image-20240503210127943

1
2
// 只有当链表一个元素都没有才返回空
if(!head) return NULL;

代码实现

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
/**
* 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) return NULL;
// 迭代版本
ListNode * p = head;
ListNode * q = head -> next;

// 当q不为空,则可以一直反转
while(q){
ListNode * t = q -> next;
q -> next = p;
p = q;
q = t;
}

head -> next = NULL;

// q为空,p是原来链表中的最后一个元素
return p;
}
};