思路:这道题应该一步一步分析,可以在纸上画出每一步的步骤,按照步骤写代码,最后再把一些特殊的点带进去进行验证!假设链表为 1 2 3 手绘分析图如下:
代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head; // 快指针
ListNode* pre = NULL; // 慢指针
ListNode* tmp = NULL; // 用于保存指针方向更换前的 下个地址
// 注意看,这是一个"循环"
while(cur){
tmp = cur->next; // cur->next为右值,下次大概率为左值
cur->next = pre; // pre为右值,下次大概率为左值
pre = cur; // cur为右值,下次大概率为左值
cur = tmp; // tmp为右值,下次大概率为左值
}
return pre; // 注意这时cur为 NULL,应该返回pre
}
};
/**
* 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) {}
* };
*/