题目链接
Leetcode链接:206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目范围是 [0, 5000]
- 5000 <= Node.val <= 5000
1. 头插法
定义一个新的链表,然后取结点进行头插。
如图:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* newnode = nullptr;
ListNode* cur = head;
while(cur)
{
ListNode* next = cur->next;
cur->next = newnode;
newnode = cur;
cur = next;
}
return newnode;
}
};
2. 迭代法
迭代法,其实很简单,我们需要借助三个指针,如图:
接下来我们看看他们是如何迭代的吧:
动图演示:
从动图可以看出,当cur为空时,循环结束,代码实现如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
ListNode* prev = nullptr;
ListNode* next = nullptr;
while(cur)
{
next = cur->next;//保存下一个结点
//反转
cur->next = prev;
//迭代
prev = cur;
cur = next;
}
return prev;
}
};
3. 递归法
递归法相对于抽象一点,但是其实和迭代法是一样的逻辑,同样是当cur为空的时候循环结束。
当我们将迭代法写出来后,理解递归法就不难了,代码逻辑都是一样的
class Solution {
public:
ListNode* reverse(ListNode* prev, ListNode* cur)
{
if(cur == NULL)
return prev;
ListNode* next = cur->next;
cur->next = prev;
//递归
return reverse(cur, next);
}
ListNode* reverseList(ListNode* head) {
return reverse(NULL,head);
}
};