剑指offer:面试题16——反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。
思路:
第一种:借助栈
第二种:为了防止链表断裂,将当前节点、当前节点的前一个和后一个节点都保存下来
/*
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 nullptr;
/* ListNode* pNewHead=NULL;
ListNode* curNode=NULL;
stack<ListNode*> m_Stack;
while(pHead!=NULL)
{
m_Stack.push(pHead);
pHead=pHead->next;
}
pNewHead=m_Stack.top();
curNode=pNewHead;
m_Stack.pop();
while(!m_Stack.empty())
{
curNode->next=m_Stack.top();
curNode=m_Stack.top();
m_Stack.pop();
}
curNode->next=NULL;
return pNewHead; */
ListNode *pPrev=NULL;
ListNode *pNode=pHead;
ListNode *pNewHead=NULL;
ListNode *pNext=NULL;
while(pNode!=NULL)
{
pNext=pNode->next;
if(pNext==NULL) pNewHead=pNode;
pNode->next=pPrev;
pPrev=pNode;
pNode=pNext;
}
return pNewHead;
}
};