【数据结构】经典链表题目详解集合(反转链表、相交链表、链表的中间节点、回文链表)

文章目录

  • 一、反转链表
    • 1、程序详解
    • 2、代码
  • 二、相交链表
    • 1、程序详解
    • 2、代码
  • 三、链表的中间节点
    • 1、程序详解
    • 2、代码
  • 四、回文链表
    • 1、程序详解
    • 2、代码

一、反转链表

1、程序详解

题目:给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

示例 :(将链表逆置)
在这里插入图片描述

  1. 方法一:创建新链表。 遍历原链表,并将节点依次头插到新链表中。
  2. 方法二:创建三个指针 。 通过指针的不断移动,依次完成反转
    创建三个结构体指针:n1、n2、n3
    令 n1指向空,n2指向头节点,n3指向头结点的下一个节点
    在这里插入图片描述
    分为两个步骤:
    1、n2->next=n1, 令n2指向n1
    2、n1、n2、n3不断向后移动
    在这里插入图片描述

2、代码

struct ListNode* reverseList(struct ListNode* head){if(head==NULL)return head;struct ListNode* n1, *n2, *n3;n1=NULL, n2=head, n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}

二、相交链表

1、程序详解

题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
在这里插入图片描述
注:根据一个节点只能有一个next,相交链表一定是Y型的。

当然也有两种方法:(一定要用地址来判断)

  • 方法一:暴力求解,双层循环。
    A链表中的节点依次与B链表中的所有节点相比较,此时,时间复杂度为O(N^2)
  • 方法二:双指针
    1、找出A链表与B链表长度,相减得差值k
    2、让长链表的指针先走k步
    3、A与B的指针同时走,并相比较
    在这里插入图片描述

2、代码

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode * curA = headA, *curB = headB;int len1 = 1, len2=1;  //用len1,len2来记录两链表的长度,但在循环里面少记录一个,故初始化为1while(curA->next){curA = curA->next;len1++;}while(curB->next){curB = curB->next;len2++;}//若尾节点不相等,则两链表一定不相交if(curA != curB){return NULL;}//相交//找出长链表和短链表struct ListNode * longList = headA, *shortList = headB;int gre = abs(len1-len2);if(len1<len2){longList = headB;shortList = headA;}//找出长短链表后,让长链表先走差步while(gre--){longList = longList->next;}//两链表同时走while(longList != shortList){longList = longList->next;shortList = shortList->next;}return longList;
}

三、链表的中间节点

1、程序详解

题目:给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。
在这里插入图片描述

  • 方法:快慢指针
    若使快指针的速度始终是慢指针的二倍,那么当快指针走到链表结尾,慢指针刚好走到链表的中间。
    在这里插入图片描述

2、代码

struct ListNode* middleNode(struct ListNode* head) {//快慢指针,快指针走两步,慢指针走一步struct ListNode* fast = head, *slow = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}

四、回文链表

1、程序详解

题目:给你一个单链表的头节点 head ,请你判断该链表是否为
回文链表。如果是,返回 true ;否则,返回 false 。
在这里插入图片描述

  • 方法:
    1、找到中间节点
    2、将中间节点之后的节点进行反转
    3、将中间节点之前的与反转后的节点 的val值进行比较

故回文链表综合了 反转链表与链表的中间节点,了解了这两个题目方法后,我们只需写进行比较的代码。
在这里插入图片描述

2、代码

//找中间节点
struct ListNode *fac1(struct ListNode * head)
{struct ListNode * fast=head, *slow=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}
//反转
struct ListNode *fac2(struct ListNode * head)
{struct ListNode * n1, *n2, *n3;n1=NULL, n2=head, n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}
bool isPalindrome(struct ListNode* head) {struct ListNode * mid = fac1(head);struct ListNode * rmid = fac2(mid);//进行比较while(rmid && head){if(rmid->val != head->val)return false;rmid=rmid->next;head=head->next;}return true;
}

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

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

相关文章

理解注意力机制与多头注意力:深度学习中的“聚焦术”

Attention 理解注意力机制与多头注意力&#xff1a;深度学习中的“聚焦术”什么是注意力机制&#xff1f;**核心思想** 什么是多头注意力机制&#xff1f;**工作原理** **多头注意力的优势****应用领域****结论** 理解注意力机制与多头注意力&#xff1a;深度学习中的“聚焦术”…

MLIR

方言 简介操作块区域值范围Control Flow and SSACFG Regions 操作与多区域&#xff08;Operations with Multiple Regions&#xff09;闭包&#xff08;Closure&#xff09;图形区域&#xff08;Graph Regions&#xff09;参数和结果&#xff08;Arguments and Results&#xf…

vscode编辑keil工程

1.编码问题 通常keil默认amsi格式&#xff0c;vscode默认utf-8格式&#xff0c;直接打开会出现乱码问题。 解决过程&#xff1a; 1.想着创建keil阶段&#xff0c;就使用utf-编码格式。 在区域设置里面“选择beta版&#xff0c;提供全球utf-8 提供全球语言支持”&#xff0c…

JVM专题之内存模型以及如何判定对象已死问题

体验与验证 2.4.5.1 使用visualvm **visualgc插件下载链接 :https://visualvm.github.io/pluginscenters.html https://visualvm.github.io/pluginscenters.html **选择对应JDK版本链接--->Tools--->Visual GC** 2.4.5.2 堆内存溢出 * **代码** java @RestCont…

从0制作自己的ros导航小车(01、准备工作)

@TOC 前言 本篇说明需要具备的知识和软硬件。可以不用全部具备,但基础要有,写的不是非常详细。 本小车分为上位机与下位机两部分,上位机使用旭日x3派运行ros进行开发和算法实现,下位机使用stm32驱动底盘和传感器数据采集。 一、知识 ①stm32部分(当然也可以使用其它控制…

uniapp/Android App上架三星市场需要下载所需要的SDK

只需添加以下一个权限在AndroidManifest.xml <uses-permission android:name"com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>uniapp开发的&#xff0c;需要在App权限配置中加入以上的额外权限&#xff1a;

1958.力扣每日一题7/7 Java(100%解)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先将指定位…

游戏开发面试题5

什么是进程、线程、协程 进程 进程是计算机的一种基本运行单位&#xff0c;由操作系统管理资源和分配资源的基本单位&#xff0c;进程可以理解为一个正在运行的程序 线程 线程是计算机的一种独立执行单元&#xff0c;是操作系统能够进行运算调度的基本单位&#xff0c;线程之间…

排序 -- 手撕归并排序(递归和非递归写法)

一、基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…

汉诺塔与青蛙跳台阶

1.汉诺塔 根据汉诺塔 - 维基百科 介绍 1.1 背景 最早发明这个问题的人是法国数学家爱德华卢卡斯。 传说越南河内某间寺院有三根银棒&#xff0c;上串 64 个金盘。寺院里的僧侣依照一个古老的预言&#xff0c;以上述规则移动这些盘子&#xff1b;预言说当这些盘子移动完毕&am…

SpringMVC(2)——controller方法参数与html表单对应

controller方法参数与html表单对应 0. User实体类 import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map;public class User implements Serializable {private …

ES7210高性能四通道音频ADC转换模拟麦克风为IIS数字咪头

特征 高性能多位 Delta-Σ 音频 ADC 102 dB 信噪比 -85 分贝 THDN 24 位&#xff0c;8 至 100 kHz 采样频率 I2S/PCM 主串行数据端口或从串行数据端口 支持TDM 256/384Fs、USB 12/24 MHz 和其他非标准音频系统时钟 低功耗待机模式 应用 麦克风阵列 智能音箱 远场语音捕获 订购…

微服务的分布式事务解决方案

微服务的分布式事务解决方案 1、分布式事务的理论模型1.1、X/Open 分布式事务模型1.2、两阶段提交协议1.3、三阶段提交协议 2、分布式事务常见解决方案2.1、TCC补偿型方案2.2、基于可靠性消息的最终一致性方案2.3、最大努力通知型方案 3、分布式事务中间件 Seata3.1、AT 模式3.…

人工智能在软件开发中的角色:助手还是取代者?

人工智能在软件开发中的角色&#xff1a;助手还是取代者&#xff1f; 随着科技的飞速发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域的应用越来越广泛。从代码生成、错误检测到自动化测试&#xff0c;AI工具正成为开发者的重要助手。然而&#xf…

Postgresql - 用户权限数据库

1、综述 在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、部门、角色、菜单这几个部分展…

Django QuerySet对象,filter()方法

filter()方法 用于实现数据过滤功能&#xff0c;相当于sql语句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)类似sql 中的 10 filter(字段名__gt10) 类似SQL中的 >10 filter(price__lt29.99) 类似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

程序升级bootloader

文章目录 概述什么是bootloader&#xff1f;为什么用&#xff1f;bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机&#xff0c;上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…

声明队列和交换机 + 消息转换器

目录 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 方法二&#xff1a;基于Spring注解的方式声明 2、消息转换器 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 注&#xff1a;队列和交换机的声明是放在消费者这边的&#xff0c;这位发送的人他…

Dynamic Web Module facet version问题

The default superclass, "javax.servlet.http.HttpServlet", according to the projects Dynamic Web Module facet version (3.1), was not found on the Java Build Path. 1.右键项目 2.点击Properties 3.点击Java Build Path&#xff0c;右边找到Libraries&…

大模型在营销领域的探索及创新

1 AIGA介绍 2 AIGA在营销领域的 应用和探索 3 总结与展望