leetcode刷题/链表 92. 反转链表 II(0ms,图解)

92. 反转链表 II

题意:

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

img

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]
解题思路:

沿用三指针的反转,判断left和right的位置来决定类型.需要额外两个节点来暂存left节点z)和left节点的前驱(p_z)

  1. left在左边界且right在右边界,全部反转;
  2. left在左边界但right不在右边界::左边节点需要指向后续链表的节点,头节点移到最后一个节点;
  3. left不在左边界但right在右边界::让z节点指向空,p_z指向反转的最后一个节点;
  4. 均不在边界::前驱节点指向最后一个节点,z指向后续链表节点;
思路图:

思路图

代码:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
    if(head->next == nullptr)
        return head;
	int count = right - left;
	int loop = left - 1;
	ListNode *p = head;
	ListNode *p_z = p;
	while (loop--)
	{
		p_z = p;
		p = p->next;
	}
    if(p == nullptr || p->next == nullptr)
        return head;
	ListNode *z = p;
	ListNode *s = p->next;
	ListNode *tmp = s->next;
	while (s != nullptr && count--)
	{
		s->next = p;
		p = s;
		s = tmp;
		if(s!=nullptr)
			tmp = s->next;
	}
	if (--left != 0 && s != nullptr)
	{
		z->next = s;
		p_z->next = p;
	}
	else if(left == 0 && s != nullptr)
	{
		z->next = s;
		head = p;
	}
	else if (left != 0 && s == nullptr)
	{
		p_z->next = p;
		z->next = nullptr;
	}
	else if (left == 0 && s == nullptr)
	{
		head = p;
		p_z->next = nullptr;
	}
        
    return head;
    }
};
运行结果:

运行结果

总结:

用了大量的空间来换取时间,如果left和right不在边界就不需要遍历链表,只需要修改其中一部分.不过这样会有点绕,容易造成死循环.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值