Leetcode刷题之回文链表和交换链表中的结点

news2024/11/19 0:22:14

竭力履行你的义务,你应该就会知道,你到底有多大的价值。      --列夫.托尔斯泰

目录

🪴一.回文链表

🌻1.快慢指针 

🍁2.把值存入数组中,然后使用双指针 

🌼二.交换链表中的结点 

🍂1.快慢指针


🪴一.回文链表

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

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

 示例 2:

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

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

 做题链接:回文链表

🌻1.快慢指针 

快慢指针就是一个快指针走两步,另一个慢指针走一步,当快指针走到尾的时候,慢指针走到中间结点的位置。然后我们把慢指针后面的结点全部反转,然后和前面没反转的链表遍历比较,如果有不相等的结点值,那么该链表就不是回文链表,反之,就是回文链表。

这题其实就是之前我们学的反转链表和找链表中间结点的结合版。我们还是通过画图来理解一下。

有了这个思路,写起代码来也就得心应手了。

//找中间结点
struct ListNode*midhead(struct ListNode*head)
{
    struct ListNode*fast=head;
    struct ListNode*slow=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

//反转链表
struct ListNode*reverselink(struct ListNode*mid)
{
    struct ListNode*phead=NULL;
    while(mid)
    {
        struct ListNode*next=mid->next;
        mid->next=phead;
        phead=mid;
        mid=next;
    }
    return phead;//返回反转链表的头结点
}

bool isPalindrome(struct ListNode* head)
{
    struct ListNode*mid=midhead(head);
    struct ListNode*cur=reverselink(mid);
    while(cur)
    {
        if(cur->val!=head->val)//只要有不相等的结点,直接返回false
        {
            return false;
        }
        else
        {
           //依次遍历两个链表,一个反转的和一个没反转的
           cur=cur->next;
           head=head->next;
        }
    } 
    return true;
}

🍁2.把值存入数组中,然后使用双指针 

这个思路非常简单,依次把链表的值存入一个数组中,然后使用left指针和right指针把数组遍历完即可。这是一种取巧的思路,这题要的就是第一种解法的思路,如果面试会考这个题,这种数组的方式肯定是不行的。但是我们是练题,肯定要多种方法都要掌握。

bool isPalindrome(struct ListNode* head)
{
   int arr[100000]={0};//注意这里是10的五次方,因为它提示链表的结点是1到10的五次方
   int i=0;
   while(head)
   {
       arr[i++]=head->val;
       head=head->next;
   }
    int left=0;
    int right=i-1;
    while(left<right)
    {
        if(arr[left]!=arr[right])
        {
           return false;
        }
        left++;
        right--;
    }
   return true;
}

🌼二.交换链表中的结点 

给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
示例 1:
 

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

示例 2:

输入:head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出:[7,9,6,6,8,7,3,0,9,5]

示例 3:

输入:head = [1], k = 1
输出:[1]

示例 4:

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

示例 5:

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

提示:

  • 链表中节点的数目是 n
  • 1 <= k <= n <= 105
  • 0 <= Node.val <= 100

做题链接:交换链表中的结点 

🍂1.快慢指针

要交换正数第k个结点和倒数第k个结点的值,就必须要找到这个两个结点,这题的目的就是如何找到这两个结点。
正数第k个结点还是很好找的,直接从头开始遍历链表,走一个结点,count就加1,当count值和k的值相等之后,即找到了正数第k个结点。那倒数第k个结点如何找呢?其实也很简单,因为正数k个结点和倒数第k个结点时对称的,所以这是我们只需要再定义一个指针(快指针),从头开始走,另一个指针就从刚刚找到的正数第k个指针(慢指针)开始走,它们两个指针同时走,直到慢指针走到尾,这时快指针所指向的位置就是倒数的k个位置。

struct ListNode* swapNodes(struct ListNode* head, int k)
{
    if(head==NULL&&head->next==NULL)
        return head;
    struct ListNode*fast=head,*slow=head;
       int count=0;
       while(fast)//该循环找正数第k个结点
       {
          count++;
          if(count==k)
            break;
            fast=fast->next;
       }
       struct ListNode*cur=fast;
        while(fast->next)//找倒数第k个结点
        {
           slow=slow->next;
           fast=fast->next;
        }
        int temp=cur->val;//定义一个遍量交换值
        cur->val=slow->val;
        slow->val=temp;
        return head;
}

 

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

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

相关文章

经典论文解读 — 端到端的VL预训练网络SOHO

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 论文标题&#xff1a; Seeing Out of tHe bOx :End-to-End Pre-training for Visual-Language Representation Learning》 Motivation 本文针对目前大量Visual-Language(VL) tasks使用由Faster-RCNN提取出的…

余弦相似度公式推导及代码实现

余弦相似度公式推导 1. 为什么使用余弦值相似度&#xff1f;2. 公式推导2.1 三角函数余弦公式推导2.2 三角函数向量余弦公式推导 3. 余弦相似度代码实现 1. 为什么使用余弦值相似度&#xff1f; 空间维度上两个点之间相似定义 在空间维度上两个点之间是有夹角和方向&#xff0…

计算机操作系统实验:页面置换算法的实现

目录 前言实验目的实验内容实验过程最佳置换算法代码实现算法流程流程图设计思路运行结果 先进先出算法代码实现算法流程流程图设计思路运行结果 最近最久未使用算法代码实现算法流程流程图设计思路运行结果 总结 前言 本实验的目的是通过编程模拟不同的页面置换算法&#xff…

基于思科模拟器的路由与交换实训报告(单臂路由、三层交换机实现vlan通信、ospf、rip、dhcp、acl、nat技术总结)

本博客是路由与交换实训报告&#xff0c;基于思科模拟器分别做了单臂路由、三层交换机实现vlan间通信、ospf、rip、dhcp、nat的实验&#xff0c;最后的nat综合实验是本次实训的大拓扑&#xff0c;综合了上述的几个技术。 大家可以当作一些思科小实验的总结&#xff0c;供网络工…

数据库管理-第七十二期 复盘(20230505)

数据库管理 2023-05-05 第七十二期 复盘1 再测试2 对照分析&#xff1a; 3 如何解决总结 第七十二期 复盘 上一期的内容&#xff0c;我承认主要是在放假&#xff0c;分析过程还是水了一点&#xff0c;SR转回国内之后&#xff0c;处理效率还是提升了一大截。 1 再测试 在客户…

Linux - 第11节 - 网络基础(一)

1.计算机网络背景 1.1.网络发展 独立模式&#xff1a;计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计…

Python进阶——实现人脸识别

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 今天我们来实现一下人脸识别~ 先问大家一个问题 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的在线接口SDK模块&#xff08;baidu-aip&#…

单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)

单链表的定义 由于顺序表存在以下缺陷&#xff0c;所以衍生出了链表&#xff0c;而链表种类有很多种&#xff0c;今天我们讲的是单链表。 顺序表存在的问题如下 1.中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释…

CPU 架构(x86/ARM)简介

CPU 架构通过指令集的方式一般可分为 复杂指令集&#xff08;CISC&#xff09; 和 精简指令集&#xff08;RISC&#xff09; 两类&#xff0c;CISC 主要是 x86 架构&#xff0c;RISC 主要是 ARM 架构&#xff0c;还有 MIPS、RISC-V、PowerPC 等架构。 本文重点介绍 x86 和 ARM…

idea中maven的几个操作按钮:clean、validate、compile...

idea中Maven生命周期指令 clean命令 清除由项目编译创建的target validate命令 验证项目是否正确&#xff0c;并且所有必要的信息均可用 compile命令 编译项目的源代码 test命令 使用合适的单元测试框架来测试编译的源代码。 这些测试不应要求将代码打包或部署 verify命令 …

智安网络|一文看懂内核平台和系统服务的联系

内核平台和系统服务是操作系统中两个非常重要的组成部分。内核平台是系统底层的核心&#xff0c;负责管理和控制计算机硬件和资源的访问。而系统服务则是在内核之上运行的程序集合&#xff0c;为操作系统提供各种功能和服务。 内核平台和系统服务的关联非常密切。系统服务必须…

Emqx的简单使用

Emqx 是一个mqtt 的服务器产品。之前activemq可以作为mqtt协议的服务器&#xff0c;但是功能相对来说比较单一。Emqx作为跟Mqtt协议相关的新一代产品&#xff0c;功能实际上更为强大。 它的功能也主要体现在可视化/认证/规则/httpApi 上面。 1.Emqx 的安装 这里采用了docker…

JMeter 计算上一个接口取值到本次接口进行四则运算赋值

项目场景&#xff1a; 公司项目需要接口关联计算进行赋值&#xff1a; 项目场景&#xff1a;A接口提取的返回值&#xff0c;在传到B接口使用时&#xff0c;需要先进行四则运算后&#xff0c;再赋值使用。 A接口提取的值 B接口需要使用计算后的值 问题描述 使用beanshell预…

必须掌握的ArrayList,LinkedList,HashMap,HashTable,Collection,Colections

人的自由并不在于可以做他想做的事&#xff0c;而在于可以不做他不想做的事。 ArrayList和linkedList的区别 Array数组是基于索引&#xff08;index&#xff09;的数据结构&#xff0c;它使用索引在数组中搜索和读取数据是很快的 Array获取数据的时间复杂度是o(1)&#xff…

南卡OE系列再添新成员,造型犀利有型,性能强劲动听!

科技的快速发展让消费者对智能互联、操作体验、设计审美、安全健康等需求越发高涨&#xff0c;蓝牙耳机也正在由功能性向舒适性方向发展。如何提高蓝牙耳机的舒适度、拥有更舒适的听歌体验&#xff0c;成为蓝牙耳机品牌和消费者共同努力的方向。 Nank南卡&#xff1a;更专业的骨…

【Linux】单机版QQ之管道中的命名管道

还记得上一篇的匿名管道吗&#xff1f; 文章目录 前言一、命名管道总结 前言 命名管道是什么呢&#xff1f; 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。 如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文…

一百零七、MySQL数据库的数据备份与数据恢复

MySQL数据库的数据备份与恢复主要有3种方法&#xff0c;前两种都是MySQL dump命令&#xff0c;第三种则是用Navicat工具直接备份。相比而言&#xff0c;第三种方法更加简单&#xff01; 1 方法一&#xff08;MySQL dump命令&#xff09; 1.1 登录MySQL [roothurys22 ~]# mysq…

Maya云渲染如何使用,Maya云渲染流程实操!

Maya 是一款专业的 3D 软件&#xff0c;用于创建逼真的角色和大片的效果&#xff0c;Maya可以加速工作流程&#xff0c;帮助您专注于创造力并按时完成任务。也可以为角色和场景添加精美的细节&#xff0c;并提供让客户满意的优质作品。更有无数业内顶级艺术家依靠 Maya来创作更…

【Halcon】新建程序 读取图片 路径设置

文章目录 1 新建程序2 读取一张图片3 图片路径4 图片格式读取报错5 快速添加 绝对路径 1 新建程序 点击新程序图标&#xff0c;即可新建&#xff1b; 程序另存为&#xff0c;会弹出保存路径 2 读取一张图片 read_image(Image,fabrik)此时工程路径下并没有图片&#xff1b; …

SpringBoot2 集成 ELK 实现日志收集

目录 一 简介 二 ELK 各组件作用 三 ELK 各组件安装 四 Spring Boot2 集成 logstash 一 简介 ELK 即 Elasticsearch、Logstash、Kibana 组合起来可以搭建线上日志系统&#xff0c;本文主要讲解使用ELK 来收集 SpringBoot2 应用产生的日志。 二 ELK 各组件作用 Elasticsea…