List
结构定义如下:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
}
L
是给定单链表,函数Reverse
要返回被逆转后的链表。
实现:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL)
return pHead;//如果链表为空或者链表中只有一个元素
ListNode* pNode=pHead;//当前指针
ListNode* pReversedHead=NULL;//新链表的头指针
ListNode* pPrev=NULL;//当前指针的前一个结点
while(pNode!=NULL){//当前结点不为空时才执行
ListNode* pNext=pNode->next;//链断开之前一定要保存断开位置后边的结点
if(pNext==NULL)//当pNext为空时,说明当前结点为尾节点
pReversedHead=pNode;
pNode->next=pPrev;//指针反转
pPrev=pNode;
pNode=pNext;
}
return pReversedHead;
/* 递归
//如果链表为空或者链表中只有一个元素
if(pHead==NULL||pHead->next==NULL) return pHead;
//先反转后面的链表,走到链表的末端结点
ListNode* pReverseNode=ReverseList(pHead->next);
//再将当前节点设置为后面节点的后续节点
pHead->next->next=pHead;
pHead->next=NULL;
return pReverseNode;
*/
/*栈操作
if(pHead==NULL||pHead->next == NULL)
return pHead;
ListNode * p=pHead;
ListNode * newHead;
stack<ListNode *> stack1;
while(p->next!=NULL)
{
stack1.push(p);
p=p->next;
}
newHead = p;
while(!stack1.empty())
{
p->next=stack1.top();
p=p->next;
stack1.pop();
}
p->next=NULL;
return newHead;
*/
}