【链表之练习题】

news2024/9/24 9:25:28

文章目录

  • 翻转链表
  • 找到链表的中间节点
  • 返回倒数第k个节点
  • 合并两个有序链表
  • 判断链表是否回文
  • 注意


翻转链表

在这里插入图片描述

    //反转链表
    //实质上是把每一个节点头插法,原本第一个节点变成最后一个节点
    public ListNode reverseList(){
            //链表为空
        if (head == null){
            return null;
        }
        //链表只有一个节点
        if (head.next == null ){
            return head;
        }
        ListNode cur = this.head.next;//先定义cur的位置
        this.head.next =null;//再把head.next置为空
        while(cur != null){
            ListNode curNext =cur.next;//再定义curNext在cur后面
            cur.next =this.head;//让cur的下一个等于头节点,就能把cur头插到head前面
            head = cur;//head给到cur
            cur = curNext;//cur再到curNext位置
        }
        return head;//返回头,就能返回一整个链表

    }
}

找到链表的中间节点

方法1:链表长度除以2得到中间节点
在这里插入图片描述

    //求链表中间节点
    //1.先求整个链表的长度
    //2.再求长度/2 就找到这个节点了
    public ListNode MiddleNode(){
            ListNode cur = this.head;
           int len = size();
           //让cur走到中间节点
        for (int i = 0; i < len/2; i++) {
            cur = cur.next;
        }
        return cur;
    }

方法2:
优化代码:快慢指针的引用

  1. 当fast == null时,遍历结束

在这里插入图片描述

  1. 当fast.next == null时,遍历结束

在这里插入图片描述
所以循环结束有两个条件:fast == null 或者 fast.next == null

    public ListNode MiddleNode1(){
        ListNode fast = this.head;
        ListNode slow = this.head;
        
        while (fast != null && fast.next != null ){
            fast = fast.next.next;
            slow = slow.next;

        }
        return slow;

    }

返回倒数第k个节点

在这里插入图片描述

    public ListNode findKthToTail(int k){
    //判断k的合法性
        if (k <= 0 || head == null){
            return null;
        }
 
        ListNode fast =head;
        ListNode slow =head;

        //先让fast走k-1步
        while(k-1 != 0){
            fast = fast.next;
            //如果k很大,这个判断可以让代码更高效
            if (fast == null){
                return null;
            }
            k--;
        }
        //slow和fast同时走
        //当fast.next =null时,slow已经在倒数第k个节点了
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }

合并两个有序链表

在这里插入图片描述
在这里插入图片描述

public class Test {
    //定义两个链表
    public static MySingleList.ListNode  mergeTwoLists(MySingleList.ListNode head1, MySingleList.ListNode head2){
        //定义一个虚拟节点,保存合并之后的新链表
        MySingleList.ListNode newH = new MySingleList.ListNode(-1);
        //newH节点是新链表的头节点,跟着记录串联之后的节点
        MySingleList.ListNode tmpH = newH;

        //当两个链表都不为空才能进入循环进行合并排序
        while(head1 != null && head2 != null){
        //当head1的值小于head2时,头节点tmpH的下一个节点就是连接小的那一个,然后head1再往后走一步           
         if (head1.val < head2.val){
                tmpH.next = head1;
                head1 = head1.next;
            }else{
            //当head2的值小于head1时,头节点tmpH的下一个节点就是连接小的那一个,然后head2再往后走一步  
                tmpH.next = head2;
                head2 = head2.next;

            }
            //无论进入那个语句,tmp都会往后走一步
            tmpH = tmpH.next;

        }
        //当head1没走完了,说明head2走完了,继续接着剩下的head1
        if(head1 != null){
            tmpH.next = head1;
        }
        //当head2没走完了,说明head1走完了,继续接着剩下的head2
        if(head2 != null){
            tmpH.next = head2;
        }
        //最后返回
        return tmpH;
    }

    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.addLast(12);
        mySingleList.addLast(23);
        mySingleList.addLast(34);
        mySingleList.addLast(45);
        mySingleList.display();//打印数组

        MySingleList mySingleList2 = new MySingleList();
        mySingleList2.addLast(15);
        mySingleList2.addLast(24);
        mySingleList2.addLast(37);
        mySingleList2.addLast(166);
        mySingleList2.display();

        MySingleList.ListNode head = mergeTwoLists(mySingleList.head,mySingleList2.head);
        mySingleList.display();
    }

判断链表是否回文

1.先找到中间节点
2.翻转
3.前面往后走,后面往前走,值是否一样
在这里插入图片描述

    //判断是否回文
    public boolean chkPalindrome(){
            ListNode fast = head;
            ListNode slow = head;
            int len = size()/2;//5/2=2

            //1.找中间位置
        while(fast != null && fast.next != null){
            //fast先走俩步,slow再走一步
            fast = fast.next.next;
            slow = slow.next;
        }

        //2.翻转
        ListNode cur = slow.next;
        while(cur != null){
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }

        //3.从前到后,从后到前
        while(head != slow){
            if (head.val != slow.val){
                return false;
            }
            //考虑偶数链表
            if (head.next == slow){
                return true;
            }
            
            head = head.next;
            slow = slow.next;
        }
        return true;
    }

注意

在写题过程中,我混淆了找中间节点和返回倒数第k个节点的方法

他们的区别其实是:
找中间节点 :fast永远是slow的二倍,slow走一步,fast就走两步。

返回倒数第k个节点 :fast和slow的关系不是固定的,fast走几步根据k-1得到,还有一个区别是,fast走了k-1步之后,slow走一步,fast也是走一步。

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

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

相关文章

【腾讯云云上实验室】向量数据库与数据挖掘分析的黄金组合指南

前言&#xff1a; 在当今信息化时代&#xff0c;掌握对数据进行挖掘和分析的能力变得愈发关键。根据需求精准处理数据不仅仅是一项技能&#xff0c;更是对未来决策和操作的至关重要的支持。除了熟练运用适当的算法模型对大数据进行挖掘和分析外&#xff0c;合理高效存储和处理大…

文件批量重命名技巧:图片文件名太长怎么办?告别手动改名方法

在日常生活中&#xff0c;常常会遇到文件名过长导致的问题。尤其是在处理大量图片文件时&#xff0c;过长的文件名可能会使得文件管理变得混乱不堪。现在来看下云炫文件管理器如何批量重命名&#xff0c;让图片文件名变得更简洁&#xff0c;提高工作效率。 操作1、在云炫文件…

Nginx模块开发之http handler实现流量统计(2)

文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计&#xff08;1&#xff09;】使用数组在单进程实现了IP的流量统计&a…

698. 划分为k个相等的子集

698. 划分为k个相等的子集 Java&#xff1a;回溯 class Solution {boolean[] used;int target;private boolean backtracking(int[] nums, int k, int sum, int start) {if (k 0) {return true; // 找到&#xff1a;立即中断栈&#xff01;并返回值}if (sum target) { // 构…

中国企业500强的排名也在不断变化。面对不确定性的挑战,企业如何应对?

随着全球经济的不断发展和变化&#xff0c;中国企业500强的排名也在不断变化。面对不确定性的挑战&#xff0c;企业如何应对&#xff1f;在本文中&#xff0c;挖数据平台将提供数据源探讨中国企业500强在应对不确定性方面的突围与变革。 一、数据挖掘与分析 从2006年到2023年&…

【电子通识】为什么说做产品不是简单的将不同的技术进行搭积木?

很多人说做产品的硬件工程师&#xff0c;其实就是将专项技术工程师已经调好的模块进行拼接。类似于小孩将积木搭成一个房子的形状&#xff0c;虽然不同人搭的房子风格迥异&#xff0c;但所使用的原材料却都是一样的。 首先我并不同意这种看法&#xff0c;原因是产品工程师是需要…

搞笑的客服日常,今天遇到的晒白客服,你遇到过吗?

大家看看这个 https://blog.csdn.net/a871923942/article/details/129778391?utm_mediumdistribute.pc_feed_404.none-task-blog-2 今天遇到傻逼审核 开头第一句就使用快捷话术 客服感觉自己发错了 然后就撤回消息 第二次继续发话术&#xff0c;说违规&#xff0c;审核不通过…

STM32入门--CAN

目录 一、bxCan简介 二、bxCAN总体描述 2.1概述 2.2CAN框图 三、bxCA的工作模式 3.1初始化模式 3.2正常模式 3.3睡眠模式&#xff08;低功耗&#xff09; 四、测试模式 4.1静默模式 4.2环回模式 五、bxCAN功能描述 5.1 发送处理 ​编辑 5.2接收管理 5.2.1 标识符过…

基于食肉植物算法优化概率神经网络PNN的分类预测 - 附代码

基于食肉植物算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于食肉植物算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于食肉植物优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

CAN实验

CAN 寄存器 HAL库函数 代码 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率&#xff1a;36000 / [(9 8 1) * 4] 500Kbps …

甲烷产生及氧化

温室气体排放被认为是加速气候变化的重要因素&#xff0c;甲烷(CH4)是仅次于二氧化碳(CO2)的重要温室气体&#xff0c;其百年温室效应潜势是CO2的28倍[1-2]。湿地中的CH4由产甲烷古菌在水体底部或沉积层严格厌氧环境下产生并释放进入水体&#xff0c;产生的CH4向上覆水运输过程…

【沐风老师】在3dMax中如何把对象随机散布在表面上?

在3dMax中如何把对象随机散布在表面上&#xff1f; 在这个教程中&#xff0c;给大家讲解在3dMax中如何把对象随机散布到另一个对象的表面上。有不少3dMax的初学者在将对象分布在随机表面上时感到手足无措。如果&#xff0c;将每个对象手动放置在表面上并花时间调整每个对象根本…

卷积神经网络(Inception V3)识别手语

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、构建Inception V3网络模型1.自己搭建2.官方模型 五、编译六、训练模型七、模型…

C++模拟如何实现vector的方法

任意位置插入&#xff0c;insert的返回值为新插入的第一个元素位置的迭代器&#xff1b;因为插入可能会进行扩容&#xff0c;导致start的值改变&#xff0c;所以先定义一个变量保存pos与start的相对位置&#xff1b;判断是否需要扩容&#xff1b;从插入位置开始&#xff0c;将所…

Qt学习(2)

1.QObject 只有继承了QObject类的类&#xff0c;才具有信号槽的能力。所以&#xff0c;为了使用信号槽&#xff0c;必须继承QObject。凡是QObject类&#xff08;不管是直接子类还是间接子类&#xff09;&#xff0c;都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽&…

dom api

dom的全称为Document Object Model,即文档对象模型.所谓文档就是html页面,对象就是js里的对象,通过这个模型把页面上的元素和js里的对象关联起来. 下面是关于dom api的一些常用方法 1.获取元素 使用querySelector()方法获取一个元素 使用querySelectorAll()方法获取所有元素 当…

MediaCodec详解

MediaCodec 是Android平台提供的一个API&#xff0c;用于对音频和视频数据进行编码&#xff08;转换为不同的格式&#xff09;和解码&#xff08;从一种格式转换回原始数据&#xff09;。它是Android 4.1&#xff08;API级别16&#xff09;及以上版本的一部分&#xff0c;允许开…

【C语言】函数(四):函数递归与迭代,二者有什么区别

目录 前言递归定义递归的两个必要条件接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位使用函数不允许创建临时变量&#xff0c;求字符串“abcd”的长度求n的阶乘求第n个斐波那契数 迭代总结递归与迭代的主要区别用法不同结构不同时间开销不同…

【Python】实现一个简单的区块链系统

本文章利用 Python 实现一个简单的功能较为完善的区块链系统&#xff08;包括区块链结构、账户、钱包、转账&#xff09;&#xff0c;采用的共识机制是 POW。 一、区块与区块链结构 Block.py import hashlib from datetime import datetimeclass Block:"""区…

智能头盔天眼摄像头、单兵执法记录仪等配合MESH自组网在应急指挥调度中的应用

智能头盔、天眼摄像头、头盔记录仪、头盔摄像头、单兵执法记录仪等配合MESH自组网在应急指挥调度中的应用。 20人背负单兵自组网&#xff08;带手咪&#xff09;到训练场&#xff0c;戴头盔&#xff0c;头盔上放头盔式摄像头&#xff0c;大功率自组网设置在制高点&#xff0c;…