反转链表
题目描述
反转一个单链表。
实例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
看到反转链表这道题,首先要想到递归。
解法一:(递归)
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
if(!head || !head->next)
{
return head;
}
ListNode *newhead = reverseList(head->next);//newhead指针记录链表末尾节点。
head->next->next = head; //比如1 2 3 4 5,当head=4时,head->next(即为5)->next=4
head->next = NULL; //4->next=NULL
return newhead;
}
};
执行用时 :8 ms, 在所有 cpp 提交中击败了96.43% 的用户
内存消耗 :9.3 MB, 在所有 cpp 提交中击败了9.63%的用户
解法二:(迭代法)
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
if(!head||!head->next)
{
return head;
}
ListNode *p,*q,*w;
p=head;
q=head->next;
w=q->next;
p->next=NULL;//处理头结点
q->next=p;
while(w!=NULL)//顺序为 p,q,w. w为空则返回q即可
{
p=q;
q=w;
w=w->next;
q->next=p;
}
return q;
}
};
执行用时 :12 ms, 在所有 cpp 提交中击败了71.71% 的用户
内存消耗 :9 MB, 在所有 cpp 提交中击败了84.58%的用户
本文深入解析了单链表的反转算法,提供了递归和迭代两种实现方式,并对比了它们的执行效率。通过具体实例,详细解释了每种方法的步骤和关键代码。
1108

被折叠的 条评论
为什么被折叠?



