4.反转指定位置段的链表

题目描述

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

题目链接

https://leetcode-cn.com/problems/reverse-linked-list-ii/description/

样例

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

进阶

使用一趟扫描完成

时间复杂度分析

整个链表只遍历了一遍,所以时间复杂度为O(n)

理解

1.需要考虑的是,如果链表中只有两个结点的情况。
2.定义一个虚拟结点,指向头结点

代码

/**
* 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) {
ListNode* fictitious = new ListNode(0);
fictitious->next = head;
if (left == right) {
return head;
}
int num = left-1;
ListNode* first = fictitious;
ListNode* last = first->next;
while (num--) {
first = first->next;
last = first->next;
}
int sum = right - left;
ListNode* a = last;
ListNode* b = a->next;
while (sum--) {
ListNode* c = b->next;
b->next = a;
a = b;
b = c;
}
first->next = a;
last->next = b;
return fictitious->next;
}
};
posted @   jsqup  阅读(125)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示