题目描述
给你单链表的头节点 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
节点,完成向后一步移动。