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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

记录一下算法题的学习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;
          }
    }
}

结语:

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

数据结构链表经典算法题集锦 前言:本章将分享十一道来自LeetCode/牛客网中的经典链表算法题来介绍数据结构链表算法题中的应用。 文章目录1.删除链表元素思路分析:题解:2.反转链表思路分析:题解:3.链表中间结点思路分析(快慢指针法):题解:4.链表中倒数第K个结点思路分析(快慢指针法):题解:5.合并两个有序链表思路分析:题解:6.链表分割思路分析:题解:7.链表回文结构(第2题和第3题的综合)思路分析:题解:8.相交链表思路分析:题解:9.环形链表I思路分析:题解:10.环形链表II思路分析:题解:11.复制带随机指针 阅读详情

相关推荐

Leetcode之链表简单难度篇)

写在前面 第一次写博客(也是第一次刷题= =),主要是想把刷到的每一道题,都记录其解题思想和步骤。之后可以每隔一段时间就快速重温每一道题的解法与难点,达到重复记忆的效果。 1.合并两个有序链表: 递归法、迭代法(最佳) 递归法: (1)递归边界:一个链表为null时返回另一个。 (2)递归主线:哪个链表的结点值小,就将递归的结果更新为其next。 迭代法: (1)设立哨兵结点,为了容易返回合并...

YB12138的博客 297

力扣Hot100系列8(Java)——[链表]总结(上)(相交链表反转链表回文链表环形链表环形链表||,合并两个有序链表

本文聚焦力扣 Hot100 中的六道链表经典题目,包括相交链表反转链表回文链表环形链表环形链表 II 及合并两个有序链表。文章结构清晰,每道题均依次呈现题目描述、核心代码、关键步骤解析及实例演示,重点拆解了双指针法、虚拟头节点、链表反转等核心技巧,深入阐释了环形链表入口查找等涉及的数学原理,帮助读者理解各题解题逻辑与边界处理要点,为链表类题目解题提供了系统的思路与参考。

2402_89049045的博客 1234

leetcode hot100 简单难度 day02-刷题

leetcode hot100 简单难度 day02-刷题

weixin_46676835的博客 853

数据结构环形相交回文、分割、合并反转链表

反转链表环形链表相交链表回文链表、分割链表合并链表寻找中间节点、返回链表中倒数第k个节点、

Yeeear的博客 839

【LeetCode Hot100 链表(上)】相交链表反转链表回文链表环形链表合并两个有序链表、两数相加

确定较长链表的起始位置,使得两个链表的剩余部分长度相同。通过让较长链表先走长度差步,保证两个链表在相同的“距离剩余部分”的起点上对齐。将这两个数相加,返回一个新的链表表示它们的和。:同步遍历两个链表,如果它们的当前节点相同,则返回该节点作为点。,判断该链表是否为回文链表。给定一个链表,如果链表中存在环,返回环的起始节点;,请编写一个函数来反转链表,并返回反转后的链表。,将它们合并成一个有序链表,并返回新的链表。:首先,遍历两个链表,分别计算它们的长度。,按顺序将它们的节点加入到新链表中。

Luo_LA的博客 920

链表算法题(数据结构)

看到这个题目的时候我们怎么去想呢?如果我们反应快的话,应该可以想到我们可以从1遍历到5然后依次头插,但是其实我们还有更好的办法,就是利用三个指针,如何使用呢?

OKkankan的博客 3763

力扣Hot100刷题日常(链表篇上)

首先我们需要知道链表 A 和链表 B 的长度。因为在开始比较两个链表是否相交之前,我们需要确保它们有相同的起始点。从长度上来说,两个链表点一定会出现在它们后续部分的某个地方。如果两个链表的长度不同,那么我们可以通过调整链表的头节点来使它们有相同的比较起点。: 假设链表 A 比链表 B 长个节点,那么我们可以让链表 A 从第个节点开始遍历;如果链表 B 比链表 A 长,那么我们让链表 B 从第个节点开始遍历。这样我们就确保了两个链表的后续部分从相同的节点开始比较。

chaodddddd的博客 3912

最详细,最简单的力扣(leetcode)hot 100 链表(上)讲解

这篇文章主要是介绍怎么解决hot 100里面关于链表篇章的问题,保证看了都能够学会。

yyyCode的博客 2909

链表经典面试题

反转链表回文链表相交链表环形链表,带环链表合并两个有序链表,双指针,快慢指针,面试题,栈空间,追击问题,中间节点的查找,暴力算法,结构体指针数组,数据结构,OJ题

2302_80105876的博客 3818

力扣hot100 | 链表 | 160. 相交链表、206. 反转链表、234. 回文链表、141. 环形链表、142. 环形链表 II、21. 合并两个有序链表、2. 两数相加

给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据整个式结构中不存在环。,函数返回结果后,链表必须示例 1:。。解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

m0_56231308的博客 1158

数据结构算法】手撕链表OJ题

数据结构算法——链表OJ经典题目练习

weixin_60478154的博客 1348

【Java】分割链表回文链表相交链表环形链表环形链表II、反转链表链表的中间节点、返回链表倒数第k个节点的值、合并两个有序链表

链表 算法

Zzzzmo_的博客 946

leetcode hot100:六、解题思路大全:链表相交链表反转链表回文链表环形链表环形链表Ⅱ、合并两个有序链表、两数相加、删除链表的倒数第N个结点、两两链表中的节点)

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

shanshan的博客 882

Java LeetCode篇-深入了解关于单链表的经典解法

1.0 移除链表元素、2.0 反转链表、3.0 链表中倒数第 k 个节点、4.0 合并两个有序链表、5.0 链表回文结构、6.0 环形链表、7.0 相加链表

小扳手 1903

算法链表相关算法

同时遍历两个链表,取 val 小的那个节点尾插到新链表中。

m0_51064412的博客 1161

LeetCodeHot100(链表篇)

帮助大家快速应对大厂算法面试

PersonJJ的博客 2052

【Java】HOT100 链表

做过总结。

weixin_43562105的博客 1051

链表算法

本文总结了15道数据结构算法练习题,重点针对顺序表和链表操作进行巩固。题目涵盖常见算法思想如双指针、反转链表环形链表等。每道题目都配有解题思路和注意事项,强调画图辅助分析的重要性。练习内容包括合并有序数组、移除元素、反转链表环形链表判断、快慢指针应用等经典题型。文章建议读者结合图示理解算法逻辑,并推荐在力扣或牛客网平台实际练习这些题目。

chen060603的博客 948

链表相关算法

核心思路总结这个写法的核心思路是 「哈希表思想(用数组模拟):记录已访问过的节点,遇到重复节点则说明有环」—— 和之前的「快慢指针法」完全不同,它更直观,但效率稍低。我们一步步拆解:先明确核心逻辑链表有环的本质是:某个节点会被「重复访问」(比如 ,遍历到第 2 次 时,说明之前已经访问过 ,形成了环)。这个方法的思路就是: 核心逻辑总结核心思路(用 “登记册” 逻辑)核心总结双指针法的本质是「让两个指针走相同的总路程」:核心思路(把链表转成熟悉的数组)链表的问题在于「不能随机访问」(比如不能直接拿到最

YSbnhoffer的博客 985
上一篇: 算法-贪心算法-简单-买卖股票的最佳时机
下一篇: 算法-二叉树-简单-二叉树的遍历
木禾呀
博客等级 码龄4年 182粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值