- 我们要反转链表,首先我们必须遍历一遍链表,所以必须有个循环来遍历这个链表
- 在反转过程中,我们必须先断开后一个结点,然后指向前一个结点,过程中有两种状态
- 当断开后一个结点的时候,此时的链表被分成了三部分,这时我们至少需要三个指针才能完整获取完整链表,所以我们必须要两个指针来记录head的前一个结点和后一个结点,这里我们用nextHead来指向head的后一个结点,用last来指向head的前一个结点(因为反转之后变为后面所以这里称为last)
- 当指向前一个结点后,此时链表变成了两部分
- 因为每个结点带有一个指针,所以我们只需逐步处理每个结点即可,直到head指向null,表示所有结点都被处理完成,所以这里我们用 head != nullptr 作为循环可以执行的条件,当head == nullptr 时表示结束,因为链表的最后一个结点指向nullptr
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* nextHead = nullptr;
ListNode* last = nullptr;
while(head != nullptr) {
nextHead = head->next; //往后移动一个结点
head->next = nullptr; //断开后一个结点
head->next = last; //连接到前一个结点
last = head; //往后移动一个结点
head = nextHead; //往后移动一个结点
}
return last;
}
};
剑指 Offer II 024. 反转链表