题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
给定:1 -> 2 -> 3 -> 4 -> 5
返回:5 -> 4 -> 3 -> 2 -> 1
代码
/**
* Definition for singly-linked list.
* 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) {
ListNode *pre = nullptr, *curr = head, *next = nullptr;
while (curr != nullptr) {
next = curr->next;
curr->next = pre;
// pre 和 curr 节点后一栋一步
pre = curr;
curr = next;
}
return pre;
}
};
解题思路
初始状态
初始状态只需要将pre和next节点指向nullptr,curr节点指向head节点。
循环步骤
第一步我们需要先保存curr节点的下一个节点,以便后续使curr节点往后移动一步。
把curr指向方向进行反转,指向pre节点。
- 反转后尾节点应该指向
nullptr,因此pre节点初始为nullptr。 - 反转前需要记录
curr的 next 节点,使得curr下一步往后移动。
当curr反转指向方向后,先将pre节点指向curr当前的位置,相当于pre节点向后移动一步。
此时把curr节点指向next节点,完成向后一步移动。