您的位置:首页 > 职场人生

【剑指Offer】面试题16:反转链表

2017-07-17 16:14 369 查看
 一:题目描述

输入一个链表,反转链表后,输出链表的所有元素。

二:解题思路

想反转一个链表,对于每一结点要改变它Pre与nextj结点的方向

 所以我们必须要记住当前节点,它的前一个结点以及后一个结点

 同时要考虑边界情况  头指针为空或者只包含一个结点

三:代码实现

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {

//想反转一个链表,对于每一结点要改变它Pre与nextj结点的方向
//所以我们必须要记住当前节点,它的前一个结点以及后一个结点
//同时要考虑边界情况 头指针为空或者只包含一个结点

//边界条件:头结点为空或只包含一个结点,不用反转,直接返回头指针
if(pHead==NULL || pHead!=NULL && pHead->next==NULL)
return pHead;

//包含多个结点,反转需要记录当前节点,它的前一个结点,它的后一个结点
ListNode* pNode=pHead; //当前节点
ListNode* pPre=NULL; //初始化当前节点的前一个节点为空
//因为反转后头结点变成节点,头结点的前一个节点变成尾结点的下一个节点,所以设置NULL
ListNode* pReverseHead=NULL; //反转后的头结点初始化为空,最终他等于原始链表的尾结点

while(pNode!=NULL){
//保存当前节点的下一个节点
ListNode* pNext=pNode->next;

//如果是尾结点,将其赋值给反转后的头指针
if(pNext==NULL)
pReverseHead=pNode;

//改变指针方向
pNode->next=pPre;
//修改pPRe:当前节点为下一个节点的前节点
pPre=pNode;
//遍历下一个节点
pNode=pNext;
}

return pReverseHead;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指Offer 链表