题目:反转链表。输入链表的头结点,反转输出反转后链表的头结点。
这种链表操作的题之前做过,还专门写过链表反转的东东。咋一看,觉得这用递归不so easy吗。结果,papa打脸了,写了半个多小时才出来,面试肯定就挂了。都要哭了,代码写一万遍都不会啊。
先用递归实现:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode *pnext=pHead->next;
if(pnext->next==NULL)
{
pnext->next=pHead;
return pnext;
}
pHead->next=NULL;
ListNode* newhead=ReverseList(pnext);
pnext->next=pHead;
return newhead;
}
};
非递归反转:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode *pnext=pHead->next;
pHead->next=NULL;
while(pnext!=NULL)
{
ListNode *pnextnext=pnext->next;
pnext->next=pHead;
pHead=pnext;
pnext=pnextnext;
}
return pHead;
}
};