当前位置: 首页 > news >正文

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构

  • 一.链表的中间节点
    • 思路1:暴力求解
    • 思路2:快慢指针
  • 二.返回倒数第k个节点
    • 思路1:暴力求解
    • 思路2:快慢指针
  • 三.反转链表
    • 思路1:头插法
    • 思路2:反转指针的指向
  • 四.链表的回文结构
    • 思路1:利用数组,判断是否回文
    • 思路2:求链表的中间节点+反转链表

要解决链表的回文结构:首先需要求中间节点,其次是会反转链表。

一.链表的中间节点

链表的中间节点
在这里插入图片描述

思路1:暴力求解

  1. 求出链表的长度。
  2. 求出要返回的中间节点的位置(除2+1),遍历链表返回节点指针即可。
  3. 注意:兼容奇数个节点与偶数个节点。
typedef struct ListNode ListNode;struct ListNode* middleNode(struct ListNode* head) 
{ListNode* cur = head;int listLength = 0; while(cur){//求链表的长度listLength++;cur = cur->next;}//链表中间节点的位置int middle = listLength / 2 + 1;int i = 1; //注意:非i=0cur = head;while(i < middle){i++;cur = cur->next;}return cur;
}

思路2:快慢指针

  1. 定义两个指针fast、slow保存链表头节点的地址。
  2. 进入循环,fast指针一次走两个节点,slow指针一次走一个节点,当fast != NULL && fast->next != NULL时循环继续,否则循环结束。

情况1.含有奇数个节点
在这里插入图片描述

情况2.含有偶数个节点

在这里插入图片描述

typedef struct ListNode ListNode;struct ListNode* middleNode(struct ListNode* head)
{//快慢指针:慢指针一次走一步,快指针一次走两步ListNode* fast = head;ListNode* slow = head;//注意循环继续的条件是&&而不是||,且fast与fast->next的位置不能交换while (fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;}return slow;
}

二.返回倒数第k个节点

返回倒数第k个节点

在这里插入图片描述

思路1:暴力求解

  1. 遍历链表求链表的长度length
  2. 倒数第k个节点,等价于从前往后的第length - k个节点。
  3. 再次遍历链表找到第length - k个节点,返回节点指针即可。

在这里插入图片描述

typedef struct ListNode ListNode;int kthToLast(struct ListNode* head, int k)
{//1.遍历链表求出链表长度,再遍历一次链表,找到返回值int size = 0;ListNode* cur = head;while(cur){size++;cur = cur->next;}int i = 0;cur = head;while(i < size - k){cur = cur->next;i++;}return cur->val;
}

思路2:快慢指针

  1. 定义两个指针fast、slow保存链表头节点的地址。
  2. fast指针先走k个节点
  3. 进入循环,fast与slow指针各自每次走一个节点,当fast != NULL时循环继续,否则循环结束。

在这里插入图片描述

typedef struct ListNode ListNode;int kthToLast(struct ListNode* head, int k)
{//2.快慢指针:快指针先走k步,然后快指针一次走一步,慢指针一次走一步ListNode* fast = head;ListNode* slow = head;for (int i = 0; i < k; i++){fast = fast->next;}while (fast != NULL){fast = fast->next;slow = slow->next;}return slow->val;
}

三.反转链表

反转链表

思路1:头插法

  1. 创建新链表 newHead = NULL。
  2. 遍历原链表,逐个节点头插倒新链表中。

在这里插入图片描述

typedef struct ListNode ListNode;struct ListNode* reverseList(struct ListNode* head) 
{//1.创建新链表,遍历原链表,逐个头插ListNode* newHead = NULL, *cur = head;while(cur){//头插ListNode* next = cur->next;cur->next = newHead;newHead = cur;cur = next;}return newHead;
}

思路2:反转指针的指向

在这里插入图片描述

typedef struct ListNode ListNode;struct ListNode* reverseList(struct ListNode* head) 
{//2.创建三个指针,反转指针的指向if(head == NULL){return NULL;}ListNode* n1 = NULL, *n2 = head, *n3 = n2->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3 != NULL){n3 = n3->next;}   }return n1;
}

四.链表的回文结构

链表的回文结构

思路1:利用数组,判断是否回文

class PalindromeList {
public://判断数组是否满足回文结构bool isReverse(int arr[], int left, int right){while(left < right){if(arr[left] != arr[right]){return false;}left++;right--;}return true;}bool chkPalindrome(ListNode* A){int arr[900];ListNode* cur = A;int i = 0, listLength = 0;while(cur){arr[i++] = cur->val;//将链表中的值保存到数组中cur = cur->next;listLength++;//求链表的长度}return isReverse(arr, 0, listLength - 1);}
};

思路2:求链表的中间节点+反转链表

  1. 寻找链表的中间节点 mid。
  2. 将中间节点 mid 以及之后的节点组成的链表反转。
  3. 遍历反转后的链表,当一个一个与原链表的数据域对比,若相同则是回文结构。

情况1.含有奇数个节点:
在这里插入图片描述
情况2.含有偶数个节点:

在这里插入图片描述

class PalindromeList {
public:ListNode* findMidNode(ListNode* phead){ListNode* fast = phead;ListNode* slow = phead;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}ListNode* reverseList(ListNode* phead){ListNode* n1, *n2, *n3;n1 = NULL, n2 = phead, n3 = n2->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3 != NULL){n3 = n3->next;}         }return n1;}bool chkPalindrome(ListNode* A) {//1.找链表的中间节点ListNode* mid = findMidNode(A);//2.反转中间节点以及之后的节点组成的链表ListNode* right = reverseList(mid);//3.遍历反转链表,与原链表进制值的比较ListNode* left = A;while(right){if(right->val != left->val){return false;}right = right->next;left = left->next;}return true;}
};

相关文章:

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构 一.链表的中间节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 二.返回倒数第k个节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 三.反转链表思路1&#xff1a;头插法思路2&#xff1a;反转指针的指向 四.链表的回文结构思路1&#xff1a;利…...

汇编学习基础知识【记录】

前言 又是快乐的学习汇编的一天&#xff0c;时间如白驹过隙&#xff0c;抓紧时间&#xff0c;在学习能力最好的年纪多学习一些知识&#xff0c;朝着美好生活而奋斗&#xff01;哈哈哈 参考文章&#xff1a; https://blog.csdn.net/Z_H_Z_0/article/details/106574292 知识补…...

【持续集成_06课_Jenkins高级pipeline应用】

一、创建项目选择pipeline的风格 它主要是以脚本&#xff08;它自己的语言&#xff09;的方式进行运行&#xff0c;一般由运维去做的事情&#xff0c;作为测试而言。了解即可。 --- 体现形式全部通过脚本去实现&#xff1a;执行之前&#xff08;拉取代码&#xff09;执行&…...

taro小程序terser-webpack-plugin插件不生效(vue2版本)

背景 最近在做公司内部的小程序脚手架&#xff0c;为了兼容老项目和旧项目&#xff0c;做了vue2taro,vue3taro两个模板&#xff0c;发现terser-webpack-plugin在vue2和vue3中的使用方式并不相同&#xff0c;同样的配置在vue3webpack5中生效&#xff0c;但是在vue2webpack4中就…...

games103作业2(未完)

PBD方法 首先是每个质点的力的分析&#xff0c;不考虑碰撞和弹簧弹力的情况下&#xff0c;每个质点受重力的影响&#xff0c;所以需要对每个质点进行速度和位置的重力影响更新。 float t 0.0333f; float damping 0.99f; int[] E; float[] L; Vector3[] V; Vector3 gra…...

避免 WebSocket 连接被拒绝

一、检查服务器配置和权限 (一)确认服务器访问权限 确保您的客户端有访问服务器的合法权限。如果服务器设置了访问控制列表(ACL)或仅允许特定的源(Origin)进行连接,您需要确保客户端的请求来源在允许的范围内。例如,如果服务器只允许来自特定域名的连接,而您的客户端从…...

shell中关于数组的使用

shell中关于数组的使用 在Shell中&#xff0c;数组是一种可以存储多个值的变量。数组的每个值都由一个数字索引来访问。在Shell中&#xff0c;数组的索引从0开始。 数组的常见的使用方法包括 数组的定义数组的打印数组长度数组的遍历数组元素的打印数组元素的添加数组元素的…...

python:绘制一元三次函数的曲线

编写 test_x3_3x.py 如下 # -*- coding: utf-8 -*- """ 绘制函数 y x^33x4 在 -3<x<3 的曲线 """ import numpy as np from matplotlib import pyplot as plt# 用于正常显示中文标题&#xff0c;负号 plt.rcParams[font.sans-serif] […...

SAP PP学习笔记26 - User Status(用户状态)的实例,订单分割中的重要概念 成本收集器,Confirmation(报工)的概述

上面两章讲了生产订单的创建以及生产订单的相关内容。 SAP PP学习笔记24 - 生产订单&#xff08;制造指图&#xff09;的创建_sap 工程外注-CSDN博客 SAP PP学习笔记25 - 生产订单的状态管理(System Status(系统状态)/User Status(用户状态)),物料的可用性检查&#xff0c;生…...

ctfshow-web入门-php特性(web104-web108)

目录 1、web104 2、web105 3、web106 4、web107 5、web108 1、web104 需要传入的 v1 和 v2 进行 sha1 加密后相等。 解法1&#xff1a; 这里都没有判断 v1 和 v2 是否相等&#xff0c;我们直接传入同样的内容加密后肯定也一样。 ?v21 post&#xff1a; v11 拿到 flag…...

python之集合相关

1.概况 是无序的数据结构 集合内的个体统称为元素&#xff0c;每个元素不可重复 所有元素被放在大括号里面&#xff0c;元素之间通过逗号分隔 集合对象是一组无序的可哈希的值&#xff0c;集合元素是不可变的数据类型 2.定义集合 使用大括号语法 基本语法&#xff1a; {元素1&a…...

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十一)-无人机服务可用性用例需求

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…...

【Linux 配置静态IP】Ubuntu20.04

最近学习网络编程&#xff0c;为了方便学习需要Ubuntu配置静态IP&#xff0c;网上看了好多贴子跟着试了下可以实现&#xff0c;但重启虚拟机后有时就无法连接&#xff0c;总之各种各样问题&#xff1b;相关的配置方法也比较凌乱&#xff0c;有用netplan 或者 ifupdown ,笔者简单…...

C++入门基础(2)

C入门基础&#xff08;2&#xff09; 1.缺省函数2.函数重载3.引用3.1 引用的概念和定义3.2 引用的特性3.3 引用的使用3.3.1引用的特性 4 .const引用5. 指针和引用的关系6.inline 1.缺省函数 • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时&#xf…...

芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…...

Java程序打印日志

一、maven依赖 POM文件中添加以下依赖&#xff0c;maven依赖的jar包版本可以在maven central repository 查看 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version><…...

深入理解C++ 中的可调⽤对象

C中的可调⽤对象总结 普通函数类成员函数类静态成员函数与类成员函数的区别 仿函数简单示例高级用法-状态保持优缺点优点缺点 函数指针获取函数地址声明并调用函数指针 lambda表达式语法定义捕获单个捕获符 std::function()协程 可调用对象用处⼴泛&#xff1a; ⽐如在使⽤⼀些…...

汇编程序调用 C 程序详解

文章目录 1. ATPCS 规则 2. 汇编和C程序传递参数 汇编程序向 C 程序的函数传递参数 C 程序返回结果给汇编程序 代码示例 3. C 函数使用栈 4. C 语言中读写寄存器 在嵌入式开发中&#xff0c;经常需要在 C 程序和 ARM 汇编程序之间进行相互调用。为了保证这些调用的正确性…...

代码随想三刷图论篇1

代码随想三刷图论篇1 98. 所有可达路径题目代码99. 岛屿数量题目代码100. 岛屿的最大面积题目代码101. 孤岛的总面积题目代码102. 沉没孤岛题目代码103. 水流问题题目代码98. 所有可达路径 题目 链接 代码 import java.util.*;class Main{public static void main(String […...

Windows 快捷键汇总

Windows 快捷键汇总 前言进阶快捷键【最好用】Chrome 常用快捷键【跟 Windows 快捷键不搭杆&#xff0c;但常用】基础快捷键扩展快捷键 前言 Coder 苦鼠标久已&#xff0c;整理汇总 Windows 快捷键包括一些常用的快捷键&#xff0c;比如“浏览器”相关的快捷键内容分为四小节&…...

微服务有哪些组件?

1.注册中心&#xff1a;用于服务的注册和发现&#xff0c;管理微服务的地址 Nacos&#xff0c;Eureka 2.配置中心&#xff1a;集中管理微服务的配置中心 Nacos config 3.远程调用&#xff1a;用于不同微服务间的通信和协作 RESTful API&#xff08;RestTemplate&#xff0…...

camera-qsc-crosstalk校准数据XTALK回写

问题背景 手机越做越紧凑&#xff0c;需要模组和芯片尺寸越做越小&#xff0c;在尺寸一定的基础上&#xff0c;高像素和大像素&#xff0c;对于手机摄像头来说&#xff0c;一直是一对矛盾的存在。 高像素&#xff1a;带来高分辨率画质大像素&#xff1a;带来暗态下高感光度和…...

混合贪心算法求解地铁线路调度

一、问题描述 城市轨道交通的繁荣发展&#xff0c;带来了车辆资源需求的日益增加。如何兼顾运营服务水平和运营成本&#xff0c;以最少的车底优质地完成运输任务成为一大严峻问题。本题在后续的描述中将由多辆动车和拖车组合而成的车组称为车底。在日常的运营组织中&#xff0…...

vue项目:关闭页面,删除本地登录信息

vue项目&#xff1a;关闭页面&#xff0c;删除本地登录信息 代码 代码 import { removeToken } from /utils/auth //区分关闭和刷新页面&#xff0c;关闭时退出登录 window.onload ()>{if(!window.sessionStorage["tempFlag"]){removeToken();location.reload()…...

获奖案例回顾|基于卫星遥感和无人机的水稻全流程风险减量项目

引言 在现代农业保险领域&#xff0c;技术创新是推动行业进步的关键。珈和科技与太平财险的合作&#xff0c;旨在利用先进的卫星遥感和无人机技术&#xff0c;解决传统农业保险面临的诸多挑战&#xff0c;从而提升保险效率和服务质量。本次分享的项目案例获得了《金融电子化》…...

全栈 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL笔记(一)

前言 阅读本文你需要有 Next.js 基础 React 基础 Prisma 基础 tailwind 基础 MySql基础 准备工作 打开网站 https://ui.shadcn.com/docs 这不是一个组件库。它是可重用组件的集合&#xff0c;您可以将其复制并粘贴到应用中。 打开installation 选择Next.js 也就是此页面…...

【Unity】制作简易计时器

一、创建计时器相关的变量 我们需要创建三个变量&#xff0c;分别是&#xff1a;计时时长、计时剩余时长、是否处于计时状态。 public float duration;//计时时长 public float remain; //计时剩余时长 public bool isCount; //是否处于计时状态 二、初始化变量 我们可以直…...

TDesign组件库日常应用的一些注意事项

【前言】Element&#xff08;饿了么开源组件库&#xff09;在国内使用的普及率和覆盖率高于TDesign-vue&#xff08;腾讯开源组件库&#xff09;&#xff0c;这也导致日常开发遇到组件使用上的疑惑时&#xff0c;网上几乎搜索不到其文章解决方案&#xff0c;只能深挖官方文档或…...

51单片机7(点亮第一个LED)

一、LED简介 1、LED&#xff0c;它是一个发光二极管&#xff0c;它具有单向导电性&#xff0c;那么通过5毫安的一个电流&#xff0c;就可以使它发光&#xff0c;那么电流越大&#xff0c;它的发光也就越强&#xff0c;但是电流不能过大&#xff0c;过大会把这个发光二极管给烧…...

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发&#xff1a;实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂&#xff0c;传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案&#xff0c;能够将系统拆分为独立、…...