版权声明: https://blog.csdn.net/qq_41880190/article/details/84433186
反转链表
ListNode* ReverseList(ListNode* pHead){ if(pHead == NULL) { return NULL; } if(pHead->next == NULL) { return pHead; } ListNode* pCur = pHead->next; ListNode* pPrev = pHead; ListNode* pNext = pCur->next; while(pCur->next) { pNext = pCur->next; pCur->next = pPrev; pPrev = pCur; pCur = pNext; } pCur->next = pPrev; //最后一个节点的指向它的前驱 pHead->next = NULL; //最后一个结点的下一个结点置 NULL return pCur;}
栈实现
ListNode* ReverseList(ListNode* pHead)
{
if (pHead == nullptr || pHead->next == nullptr)
{
return pHead;
}
stack<ListNode*> node;
ListNode* pCur = pHead;
while(pCur->next) //链表不为空入栈
{
node.push(pCur);
pCur = pCur->next;
}
ListNode* pReversedNode = pCur; //反转后新链表的头节点就是栈顶元素
while(!node.empty())
{
pCur->next = node.top();
pCur = pCur->next;
node.pop();
}
pCur->next = NULL;
return pReversedNode;
}
递归实现
ListNode* ReverseList(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL)
return pHead;
ListNode* pReversedNode = ReverseList(pHead->next);
pHead->next->next = pHead; //反转节点
phead = NULL; //第一个节点反转后置下一个为 NULL
return pReversedNode;
}
从尾到头打印链表
递归实现
void ReverseList(ListNode* pHead)
{
if(pHead != NULL)
{
if(pHead->next != NULL)
{
ListNode* pReversedNode = ReverseList(pHead->next);
}
cout << pReversedNode->data;
}
}
栈实现
j仅仅打印链表的值,不修改链表结构
先遍历链表,再打印
void ReverseList(ListNode* pHead) //先进后出利用栈的特性
{
if(pHead == NULL || pHead->next == NULL);
return phead;
stack<ListNode*> node;
ListNode* pCur = pHead;
while(pCur->next) //pCur 一直遍历直到 pCur->next == NULL,入栈结束
{
node.push(pCur);
pCur = pCur->next;
}
while(!node.empty()) //栈不为空,pop 出栈并且打印
{
pCur = node.top();
cout << pCur->data;
node.pop();
}
}