本文系《剑指offer》的刷题记录,通过牛客网在线平台测试通过。
在线测试平台:牛客网
编程资料获取:CodeLab
输入一个链表,反转链表后,输出新链表的表头,下面是链表的定义:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
对于链表反转,我们可以简单理解为指针的反转,也就是每一个结点指针指向的反转:
这里可以采用辅助指针的方式来进行历求解,以下面的链表为例具体分析如下:
1-首先我们需要定义三个指针,分别指向当前结点(cur)、前一结点(prev)、后一节点(next)
2-然后开始从前往后进行遍历,在遍历的过程中对指针进行反转
第一次遍历:将cur->next赋给next指针,再将prev赋给cur->next,这样就将指针反转了,反转之后cur指着需要继续后移,将cur再赋给prev,next再赋给cur,这样可以得到下面的结果:
继续进行遍历:
3-直到cur指针遍历完尾结点,而此时prev已经移动到尾结点,这样返回尾结点即得到链表的遍历了:
根据以上思路,实现代码如下:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL) return NULL;//如果列表为空直接返回
ListNode* prev = NULL;
ListNode* cur = pHead;
ListNode* next = NULL;
while(cur != NULL){
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;//返回反转链表之后的头结点
}
};