算法-链表-简单-相交、反转、回文、环形、合并

news2024/11/28 14:43:56

记录一下算法题的学习5

在写关于链表的题目之前,我们应该熟悉回忆一下链表的具体内容

什么是链表:

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

怎么理解呢:是这样的:一个链表,一个结点除了要保存结点自身的值以外,还需要保存下一个结点的地址(指针或引用)

链表的分类:

单向链表和双向链表

一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。

  单向链表的节点有两个属性 val,next; val是当前节点的值,next是指向下一节点的指针或引用

一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。

 链表常用的方法:

public void add(int index, E element)向指定位置插入元素。
public void addFirst(E e)头插法
public void addLast(E e)尾插法
public void clear()清空链表
public E remove(int index)删除指定位置元素
public boolean contains(Object o)判断是否含有某个元素
public E get(int index)返回指定位置的元素
public E set(int index, E element)返回指定位置的元素
public Object[] toArray()返回一个由链表组成的数组
public int indexOf(Object o)查找指定元素从前往后第一次出现的索引。

 

算法leetCode简单题目(单向链表)

相交链表:

题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

代码与思路分析 

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
         //LinkNode是JAVA中链表结点
         //创建一个哈希集合 为什么用hashSet,不用list,一个是不可重复元素,一个是可重复元素,
         Set<ListNode> select=new HashSet<ListNode>();
         //遍历链表headA将链表A中每个节点都加入哈希集合中
         ListNode node=headA;
         while(node!=null){
             select.add(node);//假设这是第一次将第一个节点加入哈希集合中
             node=node.next;//自动变为下一节点值
         }
         //遍历链表B,判断遍历到的每个节点,判断该节点是否在哈希集合中
         ListNode temp=headB;
         while(temp!=null){
             //contains() 方法用于判断元素是否在哈希集合中
           if(select.contains(temp)){
               return temp;
           }
           temp=temp.next;//自动变为下一节点值,进行遍历判断
         }
         //如果链表headB中的所有节点都不在哈希集合中,则两个链表不相交,返回null;
         return null;
    }
}

反转链表:

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

代码与思路分析:

这个链表呢,是指向下一个节点的方向发生改变,使得链表发生了反转,下图便于理解分析:

 

 

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode original=head;//指向头结点
        ListNode end=null;  //指向null;
        //循环遍历使链表反转
        while(original!=null){
            ListNode temp=original.next; //使头结点的后继结点暂存,循环往复
            original.next=end; //改变next节点指向
            end=original;  //end暂存original
            original=temp;  //original往下一节点走
            
        }
        return end;
    }
}

回文链表:

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

代码与思路分析:

首先我们要知道什么是回文即顺着看和倒着看是相同的

class Solution {
    public boolean  isPalindrome(ListNode head) {
      //我们的思路是将链表中的值复制到数组中,然后通过数组里使用左右双指针来判断是否回文
        //首先我们需要创建一个数组结构的集合,
        //使用单列集合Collection里的子接口List,它是有序且可重复元素
        List<Integer> vals=new ArrayList<Integer>();
        //其次将链表中的值复制到数组中,
        //单链表中的节点应该具有两个属性:val 和 next。
        // val 是当前节点的值,next 是指向下一个节点的指针/引用
        ListNode palindrome=head;
        while(palindrome!=null){
            vals.add(palindrome.val);//将回文链表中的每一个值复制到数组中,
            palindrome=palindrome.next;//指向下一个节点的指针/引用
        }
        //最后使用双指针判断是否回文
        int left=0; //List第一个元素的索引
        int right=vals.size()-1; //List最后一个元素的索引
        while(left<right){
            //两边发现值不相等,返回false
            if (!vals.get(left).equals(vals.get(right))) {
                return false;
            }
            left++;
            right--;
        }
        //将元素全部跑一边,顺着和倒着是相同的,返回true
        return true;
    }
}

环形链表:

题目:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

代码与思路分析:

我们重新作图使它更加直观:

 

 存储访问过的节点3 ,2,0,-4,然后我们又遇到了2这个节点,这个节点已经在哈希表中,所以证明该链表是一个环形链表。

public class Solution {
    public boolean hasCycle(ListNode head) {
        //首先创建一个哈希表,存储所有访问过的节点
        Set<ListNode>  node = new HashSet<ListNode>();
        //每当我们到达一个节点时,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中
        while(head!=null){
            if(!node.add(head)){
                return true;
            }
            //下一节点变化
            head=head.next;
        }
        //最后遍历完整个链表,发现不是环形链表,返回false;
        return false;
    }
}

合并两个有序链表:

题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

代码与思路分析:

如果 list1 或者 list2 本身就是空链表 ,那么我们就不需要合并,我们只需要返回非空链表。如果两个链表有一个为空,递归结束,因为另一个链表本身就是有序的。如果 list1 和 list2 都不是空链表,就要 判断 list1 和list2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到新链表里的节点。

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
          //首先判断链表list1和链表list2是否是空联表,如果都是空的,返回就是[];
          if(list1==null){
              return list2;
          }
          if (list2==null){
              return list1;
          }
          //然后从最初开始的两个链表的头结点的值进行比较,哪个小,就排第一位,
          //紧接着有了合并链表的头结点之后,我们找该头结点的下一节点值。
        //这里就看list1和list2哪个链表的头结点先判断出来,然后使它成为新的合并有序链表之后的新链表
          if(list1.val<list2.val){
              list1.next=mergeTwoLists(list1.next,list2);
              return list1;
          }else{
              list2.next=mergeTwoLists(list1,list2.next);
              return list2;
          }
    }
}

结语:

链表的简单学习到此结束!

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

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

相关文章

力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码

题目 695. 岛屿的最大面积 中等 相关标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你…

系列四、JVM的内存结构【本地接口(Native Interface)】

一、组成 本地接口由本地方法栈&#xff08;Native Method Stack&#xff09;、本地方法接口&#xff08;Native Interface&#xff09;、本地方法库组成。 二、本地接口的作用 本地接口的作用是融合不同的编程语言为Java所用&#xff0c;它的初衷是融合C/C程序&#xff0c;Jav…

CTFhub-RCE-过滤运算符

检查网页源代码发现如果用户输入 || &#xff08;逻辑或操作符&#xff09; 或者是 & &#xff08;按位与操作符&#xff09;&#xff0c;就不会执行。直接进行测试&#xff0c;在 URL 后输入本地 IP 进行 ping 命令测试&#xff0c;发现可以正常回显。检查网页源代码发现如…

C++基础从0到1入门编程(一)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 参考视频&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 1 第一个C程序-HelloWorld 编写一个C程序分为四个步骤&#xff1a; &#xff08;1&#xff09;创建项目 &#xff08;2&#xff…

Android开发APP显示头部Bar

Android开发显示头部Bar 需求&#xff1a; 显示如下图&#xff1a; 显示头部Bar&#xff0c;颜色也能自定义。 解决方案 这个修改是在如下三个文件里进行修改&#xff1a; 按顺序修改&#xff1a; themes.xml(night): <resources xmlns:tools"http://schemas.andr…

LeetCode(22)N 字形变换【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; N 字形变换 1.题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A …

3.6 Windows驱动开发:内核进程汇编与反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作&#xff0c;本章将通过如上案例实现远程进程反汇编功能&#xff0c;此类功能也是ARK工具中最常见的功能之一&#xff0c;通常此类功能的实现分为两部分&#xff0c;内核部分只负责读写…

滚雪球学Java(09-2):Java中的关系运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做&#xff1a;Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面&#xff1a; 代码主界面主要讲解的是 …

2023年中国冲击波治疗仪市场发展趋势分析:未来市场增长空间更大[图]

冲击波在临床医学领域最早应用于体外冲击波碎石&#xff0c;在二十世纪八十年代末期&#xff0c;体外冲击波碎石技术开始被运用到骨科及康复理疗领域&#xff0c;经过十余年的临床研究&#xff0c;冲击波疗法日益完善&#xff0c;应用范围也日益扩大。冲击波作为一种介于保守疗…

【Linux】Linux进程间通信(二)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

【开源】基于Vue和SpringBoot的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

Elasticsearch:运用向量搜索通过图像搜索找到你的小狗

作者&#xff1a;ALEX SALGADO 你是否曾经遇到过这样的情况&#xff1a;你在街上发现了一只丢失的小狗&#xff0c;但不知道它是否有主人&#xff1f; 了解如何使用向量搜索或图像搜索来做到这一点。 通过图像搜索找到你的小狗 您是否曾经遇到过这样的情况&#xff1a;你在街…

【自留地】前端 - uniapp - Vue - React - Flutter

uniapp uniapp自用速查表 - 我的常用组件 uniapp自用速查表 - 我的常用组件_uniapp static/customicons.css-CSDN博客文章浏览阅读1.8k次。uniapp项目登录退出、全局变量与状态、本地存储、Tabbar标签栏、顶部导航栏、下拉刷新、触底刷新、Ajax交互、内置组件样式修改、自定义…

2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序

2019年五一杯数学建模 C题 江苏省本科教育质量综合评价 原题再现 随着中国的改革开放&#xff0c;国家的综合实力不断增强&#xff0c;中国高等教育发展整体已进入世界中上水平。作为一个教育大省&#xff0c;江苏省的本科教育发展在全国名列前茅&#xff0c;而江苏省13个地级…

Linux:进程替换和知识整合

文章目录 进程程序替换替换原理进程替换的理解 环境变量与进程替换命令行解释器实现逻辑 进程程序替换 前面已经学习了子进程的创建&#xff0c;但是子进程的创建不管怎么说&#xff0c;都是父进程代码的一部分&#xff0c;那么实际上如果想要子进程执行新的程序呢&#xff1f…

2023年中国脑电仿生电刺激仪发展趋势分析:智能化、精准化、使用感不断提高[图]

脑电仿生电刺激仪是一种通过直接数字频率合成技术合成脑电仿真低频生物电流&#xff0c;通过粘贴于两耳侧乳突、太阳穴或风池穴部位表皮的电极&#xff0c;用仿生物电自颅外无创伤地穿透颅骨屏障刺激小脑顶核区的电疗设备。此电流刺激可启动颅脑固有神经保护机制&#xff0c;改…

【MATLAB】史上最全的9种数据拟合算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有9种数据拟合算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一算法的代码&#xff08…

Odoo 15开发手册第六章 模型 - 结构化应用数据

本章我们更进一步学习模型层&#xff0c;以及如何使用模型来设计支撑应用的数据结构。我们会探讨可用的模型类型&#xff0c;以及在使用这些类型时如何定义强制进行数据验证的约束。 模型由支持不同数据类型的数据字段组成&#xff0c;一些字段类型支持定义模型间的关联。对于…

delphi电子处方流转 sm2 sm4(医院)

【delphi电子处方流转(医院) sm2 sm4】支持 就诊登记、电子处方上传预核验、处方处方医保电子签名、电子处方上传、电子处方撤销、电子处方信息查询、电子处方审核结果查询、电子处方取药结果查询、电子处方药品目录查询等功能。技术交流Q 648437169 下载链接&#xff1a;http…