题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
分析
1.迭代反转
对于一个没有头节点的链表进行反转:起码需要只要反转哪个节点(pcur)以及反转后指向哪个节点(pre)。迭代过程需要更新,反转当前节点之后,需要反转的下一个节点是哪个(pnext)。首先初始化,反转之后的最后一个节点就是原链表的第一个节点,所以第一个节点反转之后指向NULL。所以初始化
p
r
e
=
N
U
L
L
pre=NULL
pre=NULL,
p
c
u
r
=
H
e
a
d
pcur=Head
pcur=Head.反转完第一个节点之后,需要反转第二个节点,所以更新
p
c
u
r
pcur
pcur为
p
n
e
x
t
pnext
pnext,
p
r
e
pre
pre也就是之前的
p
c
u
r
pcur
pcur(第一个节点).
ListNode* reverseList(ListNode* head) {
if(head==NULL)
return NULL;
if(head->next==NULL)
return head;
ListNode *pre=NULL;
ListNode *ReseveHead=NULL;
ListNode *pcur=head;
while(pcur!=NULL)
{
ListNode *pnext=pcur->next;
pcur->next=pre;
pre=pcur;
if(pnext==NULL)
ReseveHead=pcur;
pcur=pnext;
}
// ReseveHead=pcur;
return ReseveHead;
2.递归
这道题用递归,我想了很久才明白过来。
递归一般需要终止条件:我们现在有了终止条件:链表为空或者链表只有一个节点。
ListNode* reverseList(ListNode* head) {
if(head==NULL)
return NULL;
if(head->next==NULL)
return head;
ListNode *node=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return node;
这里递归类似于遍历,遍历到最后一个节点时,开始向下执行:当前head->next节点的next原本是指向head,然后将head->next=NULL.然后return node返回到上一层。