力扣92题:反转链表 II

news/2024/12/11 19:16:28/

力扣92题:反转链表 II

题目描述

给你单链表的头指针 head 和两个整数 leftright,其中 1 ≤ l e f t ≤ r i g h t ≤ 1 \leq left \leq right \leq 1leftright 链表长度。请你反转从位置 left 到位置 right链表节点,返回反转后的链表

示例 1:

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

示例 2:

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

解题思路

  1. 分段处理链表
    链表分为三部分:

    • pre 部分:从头节点到 left - 1 的节点;
    • reverse 部分:从 leftright 的节点;
    • post 部分:从 right + 1链表末尾的节点。
  2. 反转链表的中间部分:
    使用原地反转法,将 reverse 部分的节点顺序反转。

  3. 重新连接链表
    通过调整指针,将三部分重新连接为一个完整的链表


C语言实现

以下是基于上述思路的代码实现:

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构体
struct ListNode {int val;struct ListNode *next;
};// 反转链表 II 主函数
struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {if (head == NULL || left == right) return head;struct ListNode dummy; // 哨兵节点dummy.next = head;struct ListNode *prev = &dummy;// 1. 找到 left 节点的前驱for (int i = 1; i < left; i++) {prev = prev->next;}// 2. 反转链表的 [left, right] 部分struct ListNode *curr = prev->next;struct ListNode *next = NULL;for (int i = 0; i < right - left; i++) {next = curr->next;curr->next = next->next;next->next = prev->next;prev->next = next;}// 3. 返回新的链表return dummy.next;
}// 辅助函数:创建链表
struct ListNode* createList(int* arr, int size) {struct ListNode *head = NULL, *tail = NULL;for (int i = 0; i < size; i++) {struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));node->val = arr[i];node->next = NULL;if (head == NULL) {head = tail = node;} else {tail->next = node;tail = node;}}return head;
}// 辅助函数:打印链表
void printList(struct ListNode* head) {while (head) {printf("%d -> ", head->val);head = head->next;}printf("NULL\n");
}// 主函数测试
int main() {int arr[] = {1, 2, 3, 4, 5};struct ListNode* head = createList(arr, 5);printf("原链表: ");printList(head);head = reverseBetween(head, 2, 4);printf("反转后链表: ");printList(head);return 0;
}

测试用例

示例 1

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

示例 2

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

代码解析

1. 定义哨兵节点

struct ListNode dummy;
dummy.next = head;

通过哨兵节点简化对头节点的处理逻辑,避免头节点变化时单独处理。

2. 找到 left 的前驱节点

for (int i = 1; i < left; i++) {prev = prev->next;
}

prev 最终指向 left 节点的前驱。

3. 反转 [left, right] 区间的链表

struct ListNode *curr = prev->next;
for (int i = 0; i < right - left; i++) {next = curr->next;curr->next = next->next;next->next = prev->next;prev->next = next;
}

采用头插法逐步反转链表,核心逻辑如下:

  • curr 表示当前节点;
  • next 表示当前节点的下一个节点;
  • next 插入到 prev 之后,实现反转。

复杂度分析

  1. 时间复杂度:
    遍历链表一次,复杂度为 O ( n ) O(n) O(n)

  2. 空间复杂度:
    只使用常数级额外空间,复杂度为 O ( 1 ) O(1) O(1)


http://www.ppmy.cn/news/1554301.html

相关文章

一些硬件知识【2024/12/6】

MP6924A: 正点原子加热台拆解&#xff1a; PMOS 相比 NMOS 的缺点&#xff1a; 缺点描述迁移率低PMOS 中的空穴迁移率约为电子迁移率的 1/3 到 1/2&#xff0c;导致导通电流较低。开关速度慢由于迁移率较低&#xff0c;PMOS 的开关速度比 NMOS 慢&#xff0c;不适合高速数字电…

Spring Retry 与 Redis WATCH 结合实现高并发环境下的乐观锁

1. 前言 在当今分布式与微服务架构盛行的互联网业务场景下&#xff0c;高并发已成为常态。无论是电商秒杀、抢购活动&#xff0c;还是在线抢票、抽奖服务&#xff0c;都需要在瞬间应对大量的请求&#xff0c;并准确、高效地更新数据状态。这类场景中一个典型的问题便是如何在高…

2024年12月7日Github流行趋势

项目名称&#xff1a;lobe-chat 项目维护者&#xff1a;arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍&#xff1a;Lobe Chat 是一个开源的现代化设计的人工智能聊天框架。支持多AI提供商&#xff08;OpenAI / Claude 3 / Gemini / Ollama / Q…

业务-超卖问题(易理解)

mysql悲观锁 使用 MySQL 行锁来解决超卖问题可以通过悲观锁机制来实现。悲观锁在操作数据库时会锁定相应的行&#xff0c;确保在事务完成之前其他事务无法修改这些行。以下是使用 Java 和 MyBatis 实现这一方案的步骤。 实现 1. 数据库表设计 假设我们有一个 products 表&a…

C++ - map,set

set和map介绍 map 和 set 是C STL 中提供的容器, map 和 set 的底层是基于红黑树来实现的. set 是一个包含唯一元素 (key) 的集合&#xff0c;不允许有重复的元素. map 是一个键值对 (key - value) 的集合, 每一个键 (key) 都是唯一的. map 的key - value键值对是通过 pair 来…

互联网、物联网的相关标准

互联网的相关标准 网络通信协议&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型&#xff0c;客户端发送请求给服务器&#xff0c;服务器返回响应。HTTPS&a…

zookeeper 搭建集群

基础的java 环境先安好&#xff0c;选择3台虚拟机 ip 不一样 机器应为奇数个 zookeeper 奇数个节点实际上是(2*n-1) 比偶数台机器少一台解决成本,并且能够满足 zookeeper 集群过半选举leader 的规则 # 3台虚拟机 将zookeeper 解压到服务器上 #在 conf/ 目录下 找到zoo_s…

Spring Boot 中 WebClient 的实践详解

在现代微服务架构中&#xff0c;服务之间的通信至关重要。Spring Boot 提供了 WebClient&#xff0c;作为 RestTemplate 的替代方案&#xff0c;用于执行非阻塞式的 HTTP 请求。本文将详细讲解 WebClient 的实践&#xff0c;包括配置、使用场景以及常见的优化策略&#xff0c;帮…