【剑指offer】15-反转链表+图解

本文系《剑指offer》的刷题记录,通过牛客网在线平台测试通过。
在线测试平台:牛客网
编程资料获取:CodeLab

1-Description

输入一个链表,反转链表后,输出新链表的表头,下面是链表的定义:

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};

2-Solution

对于链表反转,我们可以简单理解为指针的反转,也就是每一个结点指针指向的反转:
这里可以采用辅助指针的方式来进行历求解,以下面的链表为例具体分析如下:
【剑指offer】15-反转链表+图解_第1张图片
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;//返回反转链表之后的头结点
    }
};

你可能感兴趣的:(笔试,反转链表,图解,剑指offer,辅助指针,c++)