单链表的相关题目

news2024/10/7 12:22:16

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;
   }


 


 

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

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

相关文章

Vim安装与配置教程(解决软件包Vim没有安装可候选)

一、Vim检测是否安装 1-输入vi查看是否安装&#xff1b; 2-按Tab键&#xff0c;显示以下字符为未安装&#xff1b; 3-显示以下字符为已安装&#xff08;可以看到有Vim&#xff09; 二、Vim安装过程 1. 打开终端&#xff0c;输入 sudo apt install vim; 2. 输入Y/y&#xff…

STM32Cube系列教程11:使用STM32 RNG硬件随机数模块生成彩票号码

文章目录 配置RNG模块编写代码获取生成的随机数运行测试 今天写段代码测试一下STM32U083RC的(RNG)硬件随机数模块 顺便写个小demo生成7位真随机数的彩票号码&#xff0c;帮助那些买彩票还有选择困难症的人群 (doge)(手动狗头)。 全部代码以上传到github&#xff1a;https://gi…

C++ (week5):Linux系统编程3:线程

文章目录 三、线程1.线程的基本概念①线程相关概念②我的理解 2.线程的基本操作 (API)(1)获取线程的标识&#xff1a;pthread_self(2)创建线程&#xff1a;pthread_create()(3)终止线程①pthread_exit()&#xff1a;当前线程终止&#xff0c;子线程主动退出②pthread_cancel()&…

C语言 | Leetcode C语言题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** ret malloc(sizeof(int*) * numRows);*returnSize numRows;*returnColumnSizes malloc(sizeof(int) * numRows);for (int i 0; i < numRows; i) {re…

【RocketMQ】安装RocketMQ5.2.0(单机版)

下载 官网下载地址&#xff1a;下载 | RocketMQ github地址&#xff1a;Tags apache/rocketmq GitHub 选择对应的版本下载。https://dist.apache.org/repos/dist/release/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip 5.2.0的二进制包&#xff1a;下载地址 5.2.0的…

C语言 | Leetcode C语言题解之第117题填充每个节点的下一个右侧节点指针II

题目&#xff1a; 题解&#xff1a; void handle(struct Node **last, struct Node **p, struct Node **nextStart) {if (*last) {(*last)->next *p;}if (!(*nextStart)) {*nextStart *p;}*last *p; }struct Node *connect(struct Node *root) {if (!root) {return NULL…

随机森林算法实现分类

随机森林算法实现对编码后二进制数据的识别 1.直接先上代码&#xff01; import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import …

数据结构之堆(优先级队列)

前言 在上一章我们讲了二叉树&#xff0c;这一节我们来讲堆&#xff08;优先级队列&#xff09;&#xff0c;所以想知道堆创建&#xff0c;可以看一下二叉树的一些简单概念。http://t.csdnimg.cn/4jUR6http://t.csdnimg.cn/4jUR6 目录 前言 堆 1.概念 2.优先级队列的模拟实…

Day06-Mybatis

1. Mybatis介绍 2. Mybatis连接数据库并返回数据事例 连接oracle数据的设置方式 spring.application.namespringboot-mybatis spring.datasource.driver-class-nameoracle.jdbc.OracleDriver spring.datasource.urljdbc:oracle:thin:192.168.100.66:1521:orcl spring.datasour…

每日一题《leetcode--59.螺旋矩阵 》

https://leetcode.cn/problems/spiral-matrix-ii/ 这道题跟我昨天发布的那道题一模一样&#xff0c;只需要注意这个矩阵是n*n。 文章代码如下&#xff1a; int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {int** array (int**)malloc(sizeof(int*) *…

Python | Leetcode Python题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; class Solution:def generate(self, numRows: int) -> List[List[int]]:ret list()for i in range(numRows):row list()for j in range(0, i 1):if j 0 or j i:row.append(1)else:row.append(ret[i - 1][j] ret[i - 1][j - 1])ret…

HCIP-Datacom-ARST自选题库__BGP多选【22道题】

1.BGP认证可以防止非法路由器与BGP路由器建立邻居&#xff0c;BGP认证可以分为MD5认证和Keychain认证&#xff0c;请问以下哪些BGP报文会携带BCGP Keychain认证信息?(报头携带) open Update Notication Keepalive 2.传统的BGP-4只能管理IPv4单播路由信息&#xff0c;MP-B…

总线带宽(总线系统的数据传送速率)

定义 总线上每秒钟传输的最大字节数或比特数 表示方法 通常使用“比特率”来表示&#xff0c;单位为比特每秒&#xff08;bps&#xff0c;b/s&#xff09;。 计算公式 总线带宽总线宽度/传输周期 其中&#xff0c;总线宽度是指数据总线的位数&#xff08;单位&#xff1a…

GBB和Prob IoU[旋转目标检测理论篇]

在开始介绍YOLOv8_obb网络之前,需要先介绍一下arxiv.org/pdf/2106.06072 这篇文章的工作,因为v8_obb就是基于这篇论文提出的GBB和prob IoU来实现旋转目标检测的。 1.高斯分布 一维高斯分布的规律是中间高两边低,且当x为均值的时候取到最大值,表达式如下,标准正态分布图如…

数据库(10)——图形化界面工具DataGrip

以后关于数据库的图片演示就使用DataGrip了 : ) 创建数据库和表 在连接上数据库之后&#xff0c;可以选择Schema创建一个新的数据库。 点击OK后&#xff0c;就已经创建了一个空的表。 要在数据库中建立一张新的表&#xff0c;右键数据库&#xff0c;点击new table 要给新表添…

基于开源项目HAL STM32F4 +DSP库跑SVPWM开环速度测试

HAL STM32F4 ARM DSP库跑SVPWM开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-neng-wu-re…

STL库--string

目录 string的定义 string中内存的访问 string常用函数实例解析 string的定义 定义string的方式跟基本类型相同&#xff0c;只需要在string后跟上变量名即可&#xff1a; string str; 如果要初始化&#xff0c;可以直接给string类型的变量进行赋值&#xff1a; string s…

Visual Studio 的使用

目录 1. 引言 2. 安装和配置 2.1 系统要求 2.2 安装步骤 2.3 初次配置 3. 界面介绍 3.1 菜单栏和工具栏 3.2 解决方案资源管理器 3.3 编辑器窗口 3.4 输出窗口 3.5 错误列表 3.6 属性窗口 4. 项目管理 4.1 创建新项目 4.2 导入现有项目 4.3 项目属性配置 5. 代…

stm32-DMA转运数据

在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟&#xff08;开启DMA的时钟&#xff09; void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用&#xff1a;开启时…

kafka-生产者发送消息消费者消费消息

文章目录 1、生产者发送消息&消费者消费消息1.1、获取 kafka-console-producer.sh 的帮助信息1.2、生产者发送消息到某个主题1.3、消费主题数据 1、生产者发送消息&消费者消费消息 1.1、获取 kafka-console-producer.sh 的帮助信息 [rootlocalhost ~]# kafka-console…