leetcode原题链接:反转链表
题目描述
给你单链表的头节点 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
解题方法:用双指针,一个前驱指针,一个后继指针。从左向右遍历,一边遍历一边逆转。当前驱指针走到最后一个节点的下一个空点时,后继指针到达链表的最后一个非空节点,即tail节点,逆转后后继节点变成了新的头节点。
C++代码
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr) {
return nullptr;
}
ListNode* pre = nullptr;//后继指针
ListNode* p = head;//前驱指针
while (p) { //跳出循环后,p指向了nullptr,pre指向了最后一个非空的tail节点
ListNode* p_next = p->next; //先把前驱指针的下一个节点保存,防止断链
p->next = pre;
pre = p;
p = p_next;
}
return pre;
}
};