定义一个函数,输入一个单链表的头结点,反转该链表并输出反转后链表的头结点。
分析:
- 对当前结点,修改其next指针指向前面结点,则需要有前驱结点的值,同时保存后驱结点的值防止断链。
- 当前结点反转后,当前结点变为前驱结点,后驱结点变为当前结点。循环迭代,直至当前结点为尾结点。
代码:
// 链表结点定义
struct ListNode
{
int value;
ListNode * pNext;
};
ListNode * ReverseList(ListNode * pHead)
{
if(pHead == nullptr)
return nullptr;
ListNode * pReverseHead = nullptr; //反转后的头结点,待返回
ListNode * pNode = pHead; //当前结点
ListNode * pPrev = nullptr; // 前驱结点
ListNode * pNext = nullptr; // 后继结点
// 当前结点指向Null时结束
while(pNode != nullptr)
{
pNext = pNode ->pNext;
// 若真,则说明当前结点为尾结点
if(pNext == nullptr)
pReverseHead = pNode;
// 反转操作
pNode->pNext = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReverseHead;
}