【链表之练习题】

文章目录

  • 翻转链表
  • 找到链表的中间节点
  • 返回倒数第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给到curcur = 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走完了,继续接着剩下的head1if(head1 != null){tmpH.next = head1;}//当head2没走完了,说明head1走完了,继续接着剩下的head2if(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.hqwc.cn/news/215655.html

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

相关文章

【Qt之QTextDocument】使用及表格显示富文本解决方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格显示富文本结论 描述 QTextDocument类保存格式化的文本。 QTextDocument是结构化富文本文档的容器&#xff0c;支持样式文本和各种文档元素&#xff0c;如列表、表格、框架和图像。…

鸿蒙4.0开发笔记之DevEco Studio如何使用低代码开发模板进行开发的详细流程(六)

鸿蒙低代码开发 一、什么是低代码二、如何进行鸿蒙低代码开发1、 创建低代码开发工程&#xff08;方式壹&#xff09;2、已有工程则创建Visual文件&#xff08;方拾贰&#xff09; 三、低代码开发界面介绍四、低代码实现页面跳转五、低代码开发建议 一、什么是低代码 所谓低代码…

C#,《小白学程序》第三课:类class,类的数组及类数组的排序

类class把数值与功能巧妙的进行了结合&#xff0c;是编程技术的主要进步。 下面的程序你可以确立 分数 与 姓名 之间关系&#xff0c;并排序。 1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /…

【数据结构】时间和空间复杂度

马上就要进入到数据结构的学习了 &#xff0c;我们先来了解一下时间和空间复杂度&#xff0c;这也可以判断我们的算法是否好坏&#xff1b; 如何衡量一个算法的好坏&#xff1f; 就是看它的算法效率 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第…

npm WARN npm npm does not support Node.js v13.9.0

Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v v13.9.0C:\Users\Administrator>npm -v npm WARN npm npm does not support Node.js v13.9.0 npm WARN npm You should probably upgrade to a newe…

无需API开发,有赞小程序集成广告推广系统,提升品牌曝光

无需API开发&#xff0c;实现有赞小程序与其他系统的连接 有赞小程序作为一个多功能的电子商务解决方案&#xff0c;为商家提供了无需复杂API开发就可以实现系统连接和集成的便捷途径。通过有赞小程序&#xff0c;商家可以轻松实现与各种系统的数据同步和应用互联&#xff0c;…

2023年亚太杯数学建模C题新能源汽车成品文章(思路模型代码成品)

一、翻译 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料(非常规车用燃料是指汽油和柴油以外的燃料&#xff09;&#xff0c;并集成了汽车动力控制和驱动等先进技术的汽车。新能源汽车包括…

HEADER请求头都有哪些,作用是什么?

HTTP 请求头是在客户端向服务器发送 HTTP 请求时&#xff0c;包含有关请求的附加信息的部分。以下是一些常见的 HTTP 请求头及其作用&#xff1a; Accept&#xff1a; 作用&#xff1a; 客户端通知服务器可以接受哪些媒体类型&#xff08;如 text/html、application/json&…

SpringBoot项目连接,有Kerberos认证的Kafka

在连接Kerberos认证kafka之前&#xff0c;需要了解Kerberos协议 二、什么是Kerberos协议 Kerberos是一种计算机网络认证协议 &#xff0c;其设计目标是通过密钥系统为网络中通信的客户机(Client)/服务器(Server)应用程序提供严格的身份验证服务&#xff0c;确保通信双方身份的真…

嵌入式FPGA IP正在发现更广阔的用武之地

作者&#xff1a;郭道正, Achronix Semiconductor中国区总经理 在日前落幕的“中国集成电路设计业2023年会暨广州集成电路产业创新发展高峰论坛&#xff08;ICCAD 2023&#xff09;”上&#xff0c;Achronix的Speedcore™嵌入式FPGA硅知识产权&#xff08;eFPGA IP&#xff09…

【VSCode】自定义转换大小写快捷键

文章目录 VSCode 是没有可以直接转换字母大小写的快捷键的&#xff0c;但是可以通过设置去定义 点击左下角设置按钮&#xff0c;并选择键盘快捷方式 在快捷方式里面搜索写&#xff0c;就能找到&#xff1a; 选择要设置的快捷键&#xff0c;并点击左侧的号 在键盘上按住你想设置…

原型 原型对象 原型链

在面向开发对象开发过程中对每一个实例添加方法&#xff0c;会使每一个对象都存在该添加方法造成空间浪费 通过对原型添加公共的属性或方法&#xff0c;使所有实例对象都可访问 原型为了共享公共的成员 prototype 原型: JS为每个构造函数提供一个属性prototype(原型),它的值…