【题目描述】输入链表的头结点,反转链表后输出链表的所有元素;
struct ListNode
{
int val;
struct ListNode *next;
};
【解题思路】
1)定义三个辅助指针和一个用于表示翻转链表头结点的指针;
2)node指向当前节点、Pprev指向当前节点的前一个节点、Pnext指向当前节点的下一个节点、ReverseHead指向翻转链表的头结点;
【反转链表的过程】
每次循环翻转一个结点;
判断node是否是最后一个结点,如果是最后一个节点,则reverseHead指node(确定翻转链表表头节点),然后node指向prev(翻转链表),退出循环;
如果不是最后一个节点,则node指向prev(翻转链表),移动prev和node指针。
/*
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution
{
public:
ListNode* ReverseList(ListNode* pHead)
{
// 反转指针
ListNode* pNode=pHead; // 当前节点
ListNode* pPrev=nullptr;// 当前节点的上一个节点
ListNode* pNext=nullptr;// 当前节点的下一个节点
ListNode*pReverseHead=nullptr;//新链表的头指针
// 反转链表
while(pNode!=nullptr)//当前结点不为空的情况下
{
pNext=pNode->next; // 建立链接
if(pNext==NULL) // 判断pNode是否是最后一个节点
{
pReverseHead=pNode;
}
pNode->next=pPrev; // 指针反转
pPrev=pNode;
pNode=pNext;
}
return pReverseHead;
}
};
题目来源:牛客网
参考博客:https://www.cnblogs.com/wanglei5205/p/8572458.html