输入一个链表,反转链表后,输出新链表的表头(c++程序)

题目描述

输入一个链表,反转链表后,输出新链表的表头。

题目分析:

1.我们先看反转节点的一般情况

 

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第1张图片

2.然后需要修改节点指向,此时发现需要两个变量before、p

让p去指向前一个节点p->next=before

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第2张图片

3.调整变量状态

before=p;

p=p->next;//此时我们发现p->next已经改变了,所以我在第二步p->next=before之前我要保存p-next的内容

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第3张图片

 

综上我的代码

ListNode* temp=p->next;//定义一个临时变量保存p->next

p->next=before;

before=p;

p=temp;

上面四句代码可以写在一个while循环中

 

接下来分析我们的初始状态

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第4张图片

结束状态:当p->next为空时我们就发现p会指导NULL,也就是说p->next==null循环就不应该在执行了

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第5张图片

所以以p->next为空做为结束条件。

while(p->next)

{

ListNode* temp=p->next;//定义一个临时变量保存p->next

p->next=before;

before=p;

p=temp;

}

当结束循环后

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第6张图片

直接p->next=before就可以了。

最后直接return p;

 

那再来排除一下特殊情况

我们如果给一个空链表,H=null;那不能进入while(p->next);会报错p为空,没有内容

所以我们一开始要对空链表进行排查。


最终代码:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==NULL) return NULL;
        
        ListNode* before=NULL;
        while(pHead->next!=NULL)
        {
            ListNode* temp=pHead->next;//定义一个临时变量保存p->next
            pHead->next=before;
            before=pHead;
            pHead=temp;           
        }
        pHead->next=before;
        return pHead;
        
    }
};

牛客网上运行截图:

输入一个链表,反转链表后,输出新链表的表头(c++程序)_第7张图片

 

你可能感兴趣的:(算法,剑指offer,C++)