leetcode 92 指定范围反转链表(中等)

本文详细解析了如何在一趟扫描中实现链表指定区间的反转,通过构建虚拟头节点简化边界处理,配合迭代断连与重连技巧,高效地完成了从位置m到n的链表元素逆序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

 

解题思路:

1、构造一个dummy节点 指向头结点,为了可以在头节点指针发生变化的时候,直接用dummy->next定位到头节点,如下:

dummy->1->2->3->4->5->null

2、利用m定位到开始节点的 前一个节点。m=2时,则操作 2那个节点。则前一个 previous 节点值为1

3、规定此时 1节点为previous节点,2节点为cur_operator_node,cur_operator_node->next即3节点是temp节点

4、断开cur_operator_node和temp的连接关系,即2和3的连接, 变更cur_operator_node->next = temp->next,即为2指向4。

断开temp和temp->next的连接关系,即3和4的连接关系,变更为temp->next = previous->next,即3指向2。

断开previous和previous->next的连接关系,即1和2的连接关系,变更为 previous->next=temp,即1指向3。

至此完成了3节点逆置,新的链表如下:

dummy->1->3->2->4->5->null

5、此时1节点仍然是previous节点,2节点仍然是cur_operator_node,cur_operator_node->next即4节点是temp节点

6、按照4的步骤:

断开cur_operator_node和temp的连接关系,即2和4的连接,变更cur_operator_node->next = temp->next,即为2指向5。

断开temp和temp->next的连接关系,即4和5的连接关系,变更为temp->next = previous->next,即4指向3。

断开previous和previous->next的连接关系,即1和3的连接关系,变更为 previous->next=temp,即1指向4。

至此完成了4节点逆置,新的链表如下:

dummy->1->4->3->2->5->null

完成逆转。返回节点头即dummy->next。

即使m=1,1节点为cur_operator_node也成立,因为previous节点存在,是dummy。

代码如下:

struct node {
		int value;
		node* next;
	};

node* reverse_with_range(node* head, int m, int n) {  //1 <= m <= n <= lenght
		//新增一个空节点指向链表头,防止从链表头倒转
		node dummy{ -1,nullptr };
		dummy.next = head;
		auto previous = &dummy;
	
		for (int i = 1; i < m; ++i) { //定位到开始节点的前一个节点
			previous = previous->next;
		}
		
		auto cur_operator_node = previous->next;
		for (int i = 0; i < n - m ; i++) { //range内倒转
			auto temp = cur_operator_node->next;
			cur_operator_node->next = temp->next;
			temp->next = previous->next;
			previous->next = temp;
		}
		return dummy.next;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值