反转链表

本文深入解析了单链表的反转算法,提供了递归和迭代两种实现方式,并对比了它们的执行效率。通过具体实例,详细解释了每种方法的步骤和关键代码。

反转链表

力扣题目链接

题目描述

反转一个单链表。
实例:
输入: 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%的用户

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值