题目描述
解题思路
首先判断头结点,如果是空,则直接返回 NULL ,不为空则进行如下操作:
- 定义三指针 a, b, c, a 暂时不指向, b 指向 head 结点, c 指向 head 结点的下一结点,令 b 的指针域为空
- 进行如下循环:
- 判断 c ,若为空,则返回 b ,不为空则继续下面的循环操作
- 令 a 为 c 的下一结点,令 c 的下一结点为 b
- 判断 a ,若为空,则返回 c ,不为空则继续下面的循环操作
- 令 b 为 a 的下一结点,令 a 的下一结点为 c
- 判断 b ,若为空,则返回 a ,不为空则继续下面的循环操作
- 令 c 为 b 的下一结点,令 b 的下一结点为 a
定义三指针的原因是:改变前两个指针指向结点的指向时不至于后续结点因没有指向而丢失
代码
/**
* 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) {
if(!head) return NULL;
ListNode* a;
ListNode* b=head;
ListNode* c=head->next;
b->next=NULL;
while(1){
if(!c) return b;
a=c->next;
c->next=b;
if(!a) return c;
b=a->next;
a->next=c;
if(!b) return a;
c=b->next;
b->next=a;
}
}
};