反转链表相关的练习(下)

news2024/9/27 12:14:38

目录

一、回文链表

二、 重排链表

三、旋转链表



一、回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1

 输入:head = [1,2,2,1]

输出:true

示例 2

 输入:head = [1,2]

输出:false

提示

  • 链表中节点数目在范围[1, 10^5]

  • 0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

代码实现

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}
​
struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* pre = NULL;
    struct ListNode* cur = head;
    while (cur != NULL)
    {
        struct ListNode* after = cur->next;
        cur->next = pre;
        pre = cur;
        cur = after;
    }
    return pre;
}
​
bool isPalindrome(struct ListNode* head)
{
    // 1. 找到中间结点,如果有两个中间结点,则找到第二个中间结点
    struct ListNode* mid = middleNode(head);
    // 2. 从中间结点开始,对后半段进行反转
    struct ListNode* rightHead = reverseList(mid);
    // 3. 进行前半段和后半段的比较
    struct ListNode* leftCur = head;
    struct ListNode* rightCur = rightHead;
    while (rightCur != NULL)
    {
        if (leftCur->val != rightCur->val)
        {
            return false;
        }
        leftCur = leftCur->next;
        rightCur = rightCur->next;
    }
    return true;
}

回文结构是一个生物学名词。双链 DNA 中含有的两个结构相同、方向相反的序列称为回文结构,每条单链以任一方向阅读时都与另一条链以相反方向阅读时的序列是一致的

palindrome n. 回文结构;回文序列 ==> 牛津:a word or phrase that reads the same backwards as forwards, for example madam.


二、 重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1

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

示例 2

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

输出:[1,5,2,4,3]

提示

  • 链表的长度范围为 [1, 5 * 10^4]

  • 1 <= node.val <= 1000

代码实现

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}
​
struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* pre = NULL;
    struct ListNode* cur = head;
    while (cur != NULL)
    {
        struct ListNode* after = cur->next;
        cur->next = pre;
        pre = cur;
        cur = after;
    }
    return pre;
}
​
void reorderList(struct ListNode* head)
{
    // 1. 找到中间结点,如果有两个中间结点,则找到第二个中间结点
    struct ListNode* mid = middleNode(head);
    // 2. 从中间结点开始,对后半段进行反转
    struct ListNode* rightHead = reverseList(mid);
    // 3. 重排链表
    struct ListNode* leftCur = head;
    struct ListNode* rightCur = rightHead;
    while (rightCur->next != NULL)
    {
        struct ListNode* leftAfter = leftCur->next;
        struct ListNode* rightAfter = rightCur->next;
        leftCur->next = rightCur;
        rightCur->next = leftAfter;
        leftCur = leftAfter;
        rightCur = rightAfter;
    }
}

图解示例二

 

三、旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1

 输入:head = [1,2,3,4,5], k = 2

输出:[4,5,1,2,3]

示例 2

 输入:head = [0,1,2], k = 4

输出:[2,0,1]

提示

  • 链表中节点的数目在范围 [0, 500]

  • -100 <= Node.val <= 100

  • 0 <= k <= 2 * 109

代码实现

struct ListNode* rotateRight(struct ListNode* head, int k)
{
    if (head == NULL)
    {
        return NULL;
    }
    // 1. 找到链表的尾结点,并计算它的长度
    struct ListNode* tail = head;
    int len = 1;
    while (tail->next != NULL)
    {
        ++len;
        tail = tail->next;
    }
    // 2. 找到倒数第 (k % len + 1) 个结点
    k %= len;
    if (k == 0)
    {
        return head;
    }
    struct ListNode* pre = head;
    for (int i = 0; i < len - k - 1; ++i)
    {
        pre = pre->next;
    }
    // 3. 旋转链表
    tail->next = head;  // (1)
    head = pre->next;  // (2)
    pre->next = NULL;  // (3)
    return head;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装mayavi的成功步骤

这篇文章是python 3.6版本&#xff0c;windows系统下的安装&#xff0c;其他python版本应该也可以&#xff0c;下载对应的包即可。 一定不要直接pip install mayavi&#xff0c;这个玩意儿对vtk的版本有要求。 下载whl包 搞了很久不行&#xff0c;咱也别费那个劲了&#xff0…

【2023】某python语言程序设计跟学第三周内容

目录1.数字类型与操作&#xff1a;整数&#xff1a;浮点数&#xff1a;复数数值运算操作符数字之间关系数值运算函数2.案例&#xff1a;天天向上的力量第一问&#xff1a;1‰的力量第二问&#xff1a;5‰和1%的力量第三问&#xff1a;工作日的力量第四问&#xff1a;工作日的努…

Dynamics365 本地部署整体界面

昨天已经登陆上去了然后今天开机突然又登陆不上去了 具体原因也不知道 然后我把注册插件删除又重新下载结果还是登陆不上去于是返回之前的断点就可以登陆上去了重复昨天的操作这里就不截图了6、注册新步骤右键单击&#xff08;插件&#xff09;BasicPlugin.FollowUpPlugin&…

MySQL 主备一致

MySQL 主备一致主备切换binlog 格式statementrowmixed生产格式循环复制问题主备切换 MySQL 主备切换流程 : 状态 1 : 客户端的读写都直接访问节点 A&#xff0c;而节点 B 是 A 的备库&#xff0c;只将 A 的更新都同步过来 , 并本地执行。来保持节点 B 和 A 的数据是相同当切换…

Python蓝桥杯训练:基本数据结构 [二叉树] 中

Python蓝桥杯训练&#xff1a;基本数据结构 [二叉树] 中 文章目录Python蓝桥杯训练&#xff1a;基本数据结构 [二叉树] 中一、[翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)二、[对称二叉树](https://leetcode.cn/problems/symmetric-tree/)三、[二叉树的最…

Vue3这样子写页面更快更高效

在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1,2 个页面的时候大多数开发者可能会直接将之前的页面代码再拷贝多…

工作记录:调研monorepo和微前端

2023年1月。因工作项目需要&#xff0c;调研 monorepo 、微前端等技术。 任务 一直在做的 BI 项目&#xff0c;随着需求迭代&#xff0c;模块越来越多&#xff0c;项目越来越复杂、臃肿。 最近&#xff0c;前一阶段的开发工作基本结束。新模块还在设计阶段。借此契机&#xf…

进阶C语言——数据的存储【详解】

文章目录1. 数据类型介绍1.1 类型的基本归类2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习3. 浮点型在内存中的存储3.1 一个例子3.2 浮点数存储的规则1. 数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 short //短整型 …

学习ForkJoin

学习ForkJoin一、普通解决多线程方式1、案例一2、效果图二、ForkJoin一、普通解决多线程方式 1、案例一 大数据量的List问题处理&#xff0c;多线程分批处理&#xff0c;需要解决的问题&#xff1a; 下标越界。线程安全。数据丢失。 private static ThreadPoolExecutor thre…

链表OJ之 快慢指针法总结

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 快慢指针指的是每次指针移动的步长&#xff0c;是解决链表相关的题目的一大利器&#xff0c;下面我将以例题的形式讲解快慢指针法。 目录 一. 链表的中间结点 思路&#xff1a; 代码实…

GMP调度模型总结

优秀文章 什么是GMP调度模型 Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务&#xff0c;将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 什么是Goroutine Goroutine Golang Coro…

云舟案例︱视频孪生技术赋能城市安全综合管理场景,提升城市数智化水平

随着城市化发展进程的加快&#xff0c;人口不断膨胀&#xff0c;社会安全隐患等问题日益突出&#xff0c;成为困扰城市建设与管理的重要难题。针对各类社会治安突出问题&#xff0c;城市管理部门积极推进城市信息化建设&#xff0c;视频监控等各类信息化采集手段为城市数字化管…

嵌入式学习笔记——使用寄存器编程实现按键输入功能

文章目录前言模块介绍原理图编程思路前言 昨天&#xff0c;通过配置通用输出模式&#xff0c;实现了LED灯的点亮、熄灭以及流水等操作&#xff0c;解决了通用输出的问题&#xff0c;今天我们再借用最常见的输入模块&#xff0c;按键来实现一个按键控制LED的功能&#xff0c;重…

SpringBoot【知识加油站】---- REST开发

SpringBoot【知识加油站】---- REST开发1. REST 简介2. REST 风格3. RESTful 入门案例1. REST 简介 REST&#xff1a;Representaional State Transfer&#xff0c;表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1 http://localhost/user/saveUser…

91. 解码方法 ——【Leetcode每日刷题】

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&#xff0…

Kubernetes13:Ingress

Kubernetes13&#xff1a;Ingress 1、把端口号对外暴露&#xff0c;通过ip端口号进行访问 使用Service里面的NodePort实现&#xff08;Cluster、LoadBanlancer、NodePort&#xff09; 2、NodePort缺陷 在每个节点上启动一个端口&#xff0c;在访问时候通过任何节点&#xf…

MySQL(五)锁

锁全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁总结计算机用锁来协调多个进程或线程并发访问某一资源。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并…

业务流程图TFD和数据流程图DFD例题

业务流程图&#xff08;TFD&#xff09;管理业务流程图&#xff08;Transaction Flow Diagram&#xff0c;简称TFD&#xff09;用来描述系统各部门、人员之间存在的业务关系、作业顺序以及管理信息流向的图表。绘制该图使用以下四种符号&#xff1a;例题例题1&#xff1a;物资订…

【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?

文章目录前言什么是外挂&#xff1f;锁血瞬移都是怎么做的&#xff1f;Unity引擎的致命缺陷是什么&#xff1f;WEB入侵如何做到&#xff1f;Unity外挂攻防概述典型游戏现实应用Unity开发流程Unity工作界面打包发布方式MonoMono跨平台原理JIT方式优点&#xff1a;因此后期Unity发…

【数据分析师求职面试指南】实战技能部分

文章目录必备技能数据人员如何创造价值完整的指标体系构建数据监控集报表设计设计一份优质的数据分析报告基于互联网大数据的应用A B 测试用户画像完整的数据挖掘项目流程1. ​分析问题&#xff0c;明确目标2.模型可行性分析3.选取模型4.选择变量5.特征工程6.建立模型&效果…