JAVA链表相关习题2

news2024/11/24 21:08:25

1.反转一个单链表。

. - 力扣(LeetCode)

 //2在1前面

//1在3前面

//ListNode cur=head.next

//head.next=null(翻转后头节点变为最后一个节点)

// while(cur != null) {
            //记录 当前需要翻转节点的下一个节点
            ListNode curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
        }
        return head;

//要求:时间复杂度O(n),空间复杂度O(1),就地翻转

//利用头插法

public ListNode reverseList() {
        if(head == null) {
            return null;
        }
        if(head.next == null) {
            return head;
        }
        //处理本身是第一个节点的节点
        ListNode cur = head.next;
        head.next = null;
        while(cur != null) {
            //记录 当前需要翻转节点的下一个节点
            ListNode curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
        }
        return head;
    }

2.快慢指针

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

876. 链表的中间结点 - 力扣(LeetCode)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        if(head==null){
            return null;
        }
        if(head.next==null){
            return head;
        }
        ListNode slow=head;
        ListNode fast=head;
        while(fast !=null&&fast.next!=null){//注意二者不可以互换
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }
}

 

//如果是在面试的高度,并不仅仅是结果的问题,还要看具体的做法是否为优。

//空间复杂度O(1)

//使用快慢指针

//路程一样,fast一次走两步,slow一次走一步,fast走完全程,slow一定在中间位置。

//循环条件:fast!=null&&fast.next!=null(顺序不能改变,否则会出现空指针异常)

//fast==fast.next.next;

//slow=slow.next;

2.2 找到链表的倒数第k个节点

思路:

 链表中倒数第k个结点__牛客网 (nowcoder.com)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(n<=0 || head==null){
            return null;
        } 
        ListNode temp=head;
        int count=0;
        //判断有几个结点
        while(temp!=null){
            count++;
            temp=temp.next;
        }
        if(n==count){
            return head.next;
        }
        int c=count-n;
        temp=head;
        for(int i=0;i<c-1;i++){
            temp=temp.next;
        }//找到该节点
        temp.next=temp.next.next;
        return head;
        }
}

 

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 

3.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

. - 力扣(LeetCode)

 

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode newHead=new ListNode();//建立一个新的链表
        ListNode tmH=newHead;
        while(list1 !=null&&list2!=null){
            if(list1.val<list2.val){
                tmH.next=list1;
                tmH=tmH.next;
                list1=list1.next;
            }
            else{
                tmH.next=list2;
                tmH=tmH.next;
                list2=list2.next;
            }
        }
        if(list1!=null){
            tmH.next=list1;
        }
        if(list2!=null){
            tmH.next=list2;
        }
        return newHead.next;
    }
}

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

//保证原来顺序不变,采用尾插法

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;
        ListNode cur = pHead;
        while (cur != null) {
            if (cur.val < x) {
                if (bs == null) {
                    bs = cur;
                    be = cur;
                } else {
                    be.next = cur;
                    be = cur;
                    //cur = cur.next;省略1
                }
                //cur = cur.next; 省略2
            } else {
                //第一次插入的时候
                if (as == null) {
                    as = cur;
                    ae = cur;
                } else {
                    ae.next = cur;
                    ae = cur;
                }
            }
            cur = cur.next;
        }

        if (bs == null) {
            return as;
        }
        //把两个链表连到一起
        be.next = as;
        if (as != null) {
            ae.next = null;
        }
        return bs;
    }
}

5. 链表的回文结构。

链表的回文结构_牛客题霸_牛客网

//正着反着遍历的结果是一致的

//只需要将链表后半部分进行翻转

1.找到链表的中间 节点


2.翻转中间节点以后的链表


3.从前 从后 开始比较

 

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // write code here
        if (A == null)
            return false;
        //1、找中间节点
        ListNode fast = A;
        ListNode slow = A;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        //slow所指的位置就是中间节点
        //2、开始翻转
        ListNode cur = slow.next;
        while (cur != null) {
            ListNode curNext = cur.next;//记录下一个节点
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        //此时翻转完成
        //3、开始判断是否为回文
        while (A != slow) {//中间位置结束的条件
            if (A.val != slow.val) {
                return false;
            }
            //偶数节点
            if (A.next == slow) {
                return true;
            }
            A = A.next;
            slow = slow.next;
        }
        return true;
    }
}

6.输入两个链表,找出它们的第一个公共结点。 

. - 力扣(LeetCode)

相交一定是“Y”字型,不可能是“X”字型

后面的链表是一样的

1.相交是Y子型
2.两个链表长度 不一样 主要体现在相交之前

3.可以先让 最长的 链表的引用 先走他们的差值步。

//分别求两个链表的长度

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null&&headB!=null){
            return null;
        }
        if(headB==null&&headA!=null){
            return null;
        }
        ListNode plong = headA;//假设A长
        ListNode pshort = headB;

        //1、分别求两个链表的长度

        int len1 = 0;
        int len2 = 0;
        
        while (plong != null) {
             len1++;
             plong = plong.next;
        }
        //O(N)
        while (pshort != null) {
            len2++;
            pshort = pshort.next;
        }
        plong = headA;
        pshort = headB;
        //2、求差值步的len
        int len = len1 - len2;
        if(len < 0) {
            plong = headB;
            pshort = headA;
            len = len2 - len1;
        }
        //保证plong 一定指向最长的链表  pshort一定指向最短的链表  len一定是一个正数
        //3、链表长的走len步
        while (len != 0) {
            plong = plong.next;
            len--;
        }
        //4、一起走,根据next值判断相遇!
        while (plong != pshort) {
            plong = plong.next;
            pshort = pshort.next;
        }
        return plong;
    }
}

 7.给定一个链表,判断链表中是否有环。

【思路】
快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。比如:陪女朋友到操作跑步减肥。
【扩展问题】
为什么快指针每次走两步,慢指针走一步可以?
假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在慢指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇。
快指针一次走 3 步,走 4 步, ...n 步行吗?

. - 力扣(LeetCode)

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null || head.next==null){
            return false;
        }
        ListNode slow=head;
        ListNode fast=head.next;
        while(slow!=fast){
            if(fast==null || fast.next==null){
                return false;
            }
            slow=slow.next;
            fast=fast.next.next;
        }
        return true;
    }
}

8.删除链表中重复的结点

删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)

import java.util.*;
/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        ListNode cur=pHead;
        ListNode newHead=new ListNode(-1);
        ListNode tempHead=newHead;
        //遍历链表中的每个结点
        while(cur!=null){
            if(cur.next!=null&&cur.val==cur.next.val){
                //一直让cur走到不重复的节点,然后把这个节点加到不重复的链表中
                while(cur.next!=null&&cur.next.val==cur.val){
                    cur=cur.next;
                }
                cur=cur.next;
            }else{
                tempHead.next=cur;
                tempHead=tempHead.next;
                cur=cur.next;
            }
        }
        tempHead.next=null;
        return newHead.next;
    }
}

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

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

相关文章

9、String类型和基本数据类型转换(Java)

String类型和基本数据类型转换 1、基本数据类型转String类型2、String类型转基本数据类型⭐ 1、基本数据类型转String类型 Java中String类型是字符串类型&#xff0c;是用 “ ” 双引号括起来的内容&#xff0c;所以基本数据类型转String类型直接&#xff0b;“ ”即可。&…

损失一件外套?

2024/05/07&#xff0c;晴 碎碎念一波&#xff01; 早上洗漱完要出门时&#xff0c;发现自己昨天穿的外套不见了&#xff01;&#xff01;&#xff01;外套上身效果很不错&#xff0c;买了1年多穿的频率非常高&#xff0c;现在丢了还真挺可惜。 衣服口袋有一个耳机&#xff0…

stm32单片机遇到的问题(持续更新)

flymcu下载问题一直显示连接&#xff0c;实际是连接不上 参考&#xff0c;软件一键下载电路等 使用flymcu下载程序过程中&#xff0c;检测两个地方**&#xff0c;第一&#xff0c;两个boot引脚在下载和硬件运行不同的连接方式** BOOT1x&#xff0c;BOOT00&#xff1a;最常用的模…

六西格玛备考攻略:无从下手?一文让你豁然开朗

当你决定备考六西格玛时&#xff0c;可能会感到有些无从下手。毕竟&#xff0c;这是一个涉及多个领域和方面的综合性考试&#xff0c;需要掌握的知识点和技能也非常广泛。但是&#xff0c;只要你有一个清晰的学习计划和一些有效的备考方法&#xff0c;就能够顺利地通过考试。以…

hadoop学习---基于Hive的教育平台数据仓库分析案例(三)

衔接第一部分&#xff0c;第一部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;一) 衔接第二部分&#xff0c;第二部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;二) 学生出勤模块&#xff08;全量分析&#xff09;&#xff1a…

Offer必备算法36_贪心算法三_七道力扣题详解(由易到难)

目录 ①力扣455. 分发饼干 解析代码 ②力扣553. 最优除法 解析代码 ③力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 ④力扣55. 跳跃游戏 解析代码 ⑤力扣134. 加油站 解析代码 ⑥力扣738. 单调递增的数字 解析代码 ⑦力扣991. 坏了的计算器 解析代码…

Adnroid 异常开机半屏重启代码分析

K1/K2包括家教机H9/H10&#xff0c;异常重启的时候都会开机动画都会出现半屏现象&#xff1a; 为了造这个现象&#xff0c;用eclipse把system_process stop掉就可以看到现象了&#xff1a; 由于开机动画是由SurfaceFlinger服务启动&#xff0c;出现异常会调用SurfaceFling…

特斯拉CEO马斯克访华,或加速FSD技术在中国的落地

特斯拉首席执行官埃隆马斯克于4月底进行了中国之旅&#xff0c;这一访问被业内人士认为可能加速特斯拉FSD&#xff08;Full Self-Drive&#xff0c;完全自动驾驶&#xff09;技术在中国的应用。业内专家指出&#xff0c;马斯克的此番到访可能会对中国自动驾驶市场产生深远影响&…

视频转GIF动图:一键批量操作技巧,轻松实现动态图像转换

在数字媒体时代&#xff0c;GIF动图因其小巧、循环播放的特性&#xff0c;在网络传播中占据了重要地位。而将视频转换为GIF动图&#xff0c;不仅可以快速捕捉视频中的精彩瞬间&#xff0c;还能为社交媒体、网站和博客等内容创作增添生动与活力。本文将介绍如何通过一键批量操作…

【how2j JQuery部分】课后题答案及相关笔记

练习题 <script src"jquery.min.js"></script><script>$(function(){$(tr:odd).css({"background-color":"#f8f8f8"});}); </script> <style> table{border-collapse:collapse;width:90%;} tr{border-bottom-sty…

【spark】win10 pyspark3.5.1 安装超级简单

下载地址&#xff1a;https://spark.apache.org/downloads.html 下载完成&#xff1a; 复制文件到自己的路径下&#xff0c;路径最好不要有中文、空格&#xff1b; 解压tgz文件&#xff1a; 修改环境变量&#xff1a; 创建SPARK_HOME&#xff1a; D:\software_download\spar…

实测幻方新出的超强AI大模型,中文能力对比GPT4.0不落下风

目前从网上的消息来看&#xff0c;DeepSeek中文综合能力&#xff08;AlignBench&#xff09;开源模型中最强&#xff0c;与GPT-4-Turbo&#xff0c;文心4.0等闭源模型在评测中处于同一梯队。 话不多说&#xff0c;我们开测&#xff01; 1.首先我们来让他直接来一段逻辑推理【并…

CAN报文总线仲裁机制

对于标准帧而言&#xff0c;有11位的标识符&#xff0c;也就是报文的ID。报文的ID值越小&#xff0c;优先级越高。如果有两个以上的ECU同时发送CAN报文&#xff0c;ID值小的报文可以发送成功。总线仲裁机制是一种非破坏性仲裁&#xff0c;是一种既不会造成已发送数据的延迟&…

rust使用serde_json转换Value为rust中的数据类型

为了方便转换未知json数据&#xff0c;我们可以使用serde提供的value类型来进行转换&#xff0c;将json字符串转化为Value值&#xff0c;然后可以快速使用get方法来获取值&#xff1a; let json_str r#"{"name": "John","age": 30,"c…

3D 交互展示该怎么做?

在博维数孪&#xff08;Bowell&#xff09;平台制作3D交互展示的流程相对简单&#xff0c;主要分为以下几个步骤&#xff1a; 1、准备3D模型&#xff1a;首先&#xff0c;你需要有一个3D模型。如果你有3D建模的经验&#xff0c;可以使用3ds Max或Blender等软件自行创建。如果没…

怎么清理服务器的C盘?

有时候我们经常会遇到C盘被占满的情况&#xff0c;C盘被占满的原因有很多&#xff0c;下面我们就来分析下有可能导致C盘占满的原因&#xff1a; 第一种情况&#xff1a;中毒 打开服务器任务管理器选择进程&#xff0c;并且勾选显示所有用户的进程&#xff0c;我们可以点击映像…

Python进行excel处理-01

最近干采购&#xff0c;每个月要对供应商的对账单&#xff0c;对对应的采购订单号和物料编号的价格和数量&#xff0c;是不是和物料管控总表里面的价格数量是不是一致&#xff0c;于是写了一个代码。 从总表里面找到&#xff0c;对账单里对应采购订单和物料编码的数据&#xf…

黄金投资怎么判断走势好坏?

投资黄金&#xff0c;就是押注于这一贵金属价格的变动。判断黄金价格的走势好坏&#xff0c;对于投资者来说至关重要。这需要从宏观经济指标、技术分析指标和市场情绪等多元化角度进行综合分析。 宏观经济指标 货币政策&#xff1a;中央银行的货币政策&#xff0c;尤其是利率决…

ADOP带你了解:PDU 与 UPS:哪一款可以满足您的真正需求?

在 IT 基础设施领域&#xff0c;可靠的电源管理不仅是一种奢侈品&#xff0c;而且是任何系统平稳运行的重要组成部分。配电单元 &#xff08;PDU&#xff09; 和不间断电源 &#xff08;UPS&#xff09; 是两种关键解决方案&#xff0c;经常用于确保您的系统具有所需的电力。清…

【垃圾分类3】垃圾分类项目常见错误和解决方法

垃圾分类项目常见错误和解决方法 目录 垃圾分类项目常见错误和解决方法 错误1&#xff1a;没有D/jupyterFile 错误2&#xff1a;jupyter-lab not found 错误3&#xff1a;tf-estimator-nightly 错误4&#xff1a;matplotlib安装 错误5&#xff1a;目录没有在D/jupyterFile下 错…