​​206. 反转链表​​

给你单链表的头节点 ​​head​​ ,请你反转链表,并返回反转后的链表。

示例 1:

【力扣-链表】3、反转链表(206)_反转链表

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例 2:

【力扣-链表】3、反转链表(206)_C++_02

输入: head = [1,2]
输出: [2,1]

示例 3:

输入: head = []
输出: []

【双指针法】:


定义一个cur指针,初始时指向头结点;定义一个pre指针,初始化为null,作为前前驱节点。定义一个tmp指针,作为临时节点。


#include <iostream>

using namespace std;

// 链表节点结构体
struct ListNode
{
int val;
ListNode *next;
ListNode(int v) : val(v), next(NULL){};
};

class Solution
{
public:
// 双指针法
ListNode *reverseList(ListNode *head)
{
// 定义当前节点
ListNode *cur = head;
// 定义前驱节点
ListNode *pre = nullptr;
// 定义一个临时节点,用来防止断链
ListNode *tmp;

// 当前节点非空时
while (cur)
{
// tmp置为下一个节点
tmp = cur->next;
// 反转链表
cur->next = pre;
// 前驱节点置为当前节点
pre = cur;
// 当前节点置为下一个节点
cur = tmp;
}

return pre;
}

void printListNode(ListNode *head)
{
while (head)
{
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
};
int main()
{
ListNode *head = new ListNode(1);
ListNode *p1 = new ListNode(2);
ListNode *p2 = new ListNode(3);
ListNode *p3 = new ListNode(4);
ListNode *p4 = new ListNode(5);
head->next = p1;
p1->next = p2;
p2->next = p3;
p3->next = p4;
Solution solu;
solu.printListNode(head);
ListNode *newHead = solu.reverseList(head);
solu.printListNode(newHead);

return 0;
}

【力扣-链表】3、反转链表(206)_C++_03

【递归法】


递归法与双指针方法逻辑相同,都是当cur位空的时候结束循环,不断将cur指向pre的过程


// 递归法
class Solution
{
public:
ListNode *reverse(ListNode *cur, ListNode *pre)
{
// 当前节点为空时返回
if (cur == nullptr)
{
return pre;
}
ListNode *tmp = cur->next;
cur->next = pre;
// 递归调用
return reverse(tmp, cur);
}
ListNode *reverseList(ListNode *head)
{
return reverse(head, NULL);
}

void printListNode(ListNode *head)
{
while (head)
{
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
};

【力扣-链表】3、反转链表(206)_后端_04