递归反转列表问题总结

本文详细介绍了如何使用迭代和递归两种方法来反转单链表。迭代方式通过for循环轻松实现,而递归方法则相对复杂,需要理解递归逻辑。递归实现中,首先反转head后面的节点,然后将其连接回头节点。同时,讨论了如何在给定区间[m,n]内反转链表,并提供了相应的代码实现。递归思想虽然挑战性较大,但其功能强大,适用于解决这类问题。
摘要由CSDN通过智能技术生成

反转单列表可以使用迭代的方式完成,也可以使用递归的方式实现,前者的实现比较简单,后者的实现有一些难度。同时反转的时候可能只是给出一定区间让你去完成反转。

迭代的实现就是找到对应的需要反转的列表的位置然后进行对应的反转,直接使用for循环即可完成操作!

将单列表的结构定义为:

class ListNode {
	public:
		int val;
		ListNode *next;
		ListNode(int x) {val = x;} 
};

递归要么是先对于当前的节点功能进行实现,然后依次递归后面的节点进行操作实现。也可以是首先递归的实现然后再实现最后的节点的功能。递归的功能很强大,实现的代码必须能够理解当前的方法可以做什么。

ListNode* reverse(ListNode* head)
{
	if(head -> next == NULL) return head;  //只有一个节点的时候反转了也是它自己
	ListNode* last = reverse(head->next);
	head -> next -> next = head;
	head -> next = NULL;
	return last;
}

上面的代码就是首先将head后面的全部节点进行一定的反转之后,然后将节点全部连接到对应的头节点上面实现,如果当前反转的时候完成开始的一部分的反转的时候则需要记录一下对应的后续节点。

反转前N个节点

ListNode* successor = NULL;
ListNode* reverseN(ListNode* head, int n)
{
	if(n == 1) {
		successor = head -> next;
		return head;
	}
	ListNode* last = reverseN(head->next, n-1);
	head -> next -> next = head;
	head -> next = successor ;
	return last;
}
//只需要对应的将其中的后继节点记录下来,然后进行对应的记录!
//再于后记节点处进行反转

反转从[m , n]之间的节点,实现的代码图下:

ListNode* reverseBetween(ListNode* head, int m, int n)
{
	if(m == 1) 
		return reverseN(head, n);	
	head -> next = reverseBetween(head->next, m - 1, n - 1);
	return head;
}

递归的思想到现在还是很难学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值