JAVA链表相关习题2

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 hereListNode 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 hereif (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、求差值步的lenint 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.hqwc.cn/news/681534.html

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

相关文章

Python——Fastapi管理平台(打包+优化)

目录 一、配置多个表 1、后端项目改造 2、导包报错——需要修改&#xff08;2个地方&#xff09; 3、启动后端&#xff08;查看是否有问题&#xff09; 4、配置前端 二、打包——成exe文件&#xff08;不包含static文件&#xff09;简单 1、后端修改 2、前端修改 3、运行打包命…

RisingWave基本操作

什么是RisingWave RisingWave 是一款基于 Apache 2.0 协议开源的分布式流数据库。RisingWave 让用户使用操作传统数据库的方式来处理流数据。通过创建实时物化视图&#xff0c;RisingWave 可以让用户轻松编写流计算逻辑&#xff0c;并通过访问物化视图来对流计算结果进行及时、…

|Python新手小白中级教程|第二十三章:列表拓展之——元组

文章目录 前言一、列表复习1.索引、切片2.列表操作字符3.数据结构实践——字典 二、探索元组1.使用索引、切片2.使用__add__((添加元素&#xff0c;添加元素))3.输出元组4.使用转化法删除元组指定元素5.for循环遍历元组 三、元组VS列表1.区别2.元组&#xff08;tuple&#xff0…

vant中van-tabs使用中的小问题

1. 怎么去掉默认选中的效果 van-tabs默认情况下启用第一个标签&#xff0c;实际开发中不满足需求&#xff0c;想要点击后再进行选中 解决办法 首先&#xff0c;在标签组数中&#xff0c;添加一个占位标签在样式中设置首个标签不显示代码如下&#xff1a; //js 实际有意思的…

OPC :快速上手

本系列为OPC技术的快速上以及持续研究和技术实战专栏&#xff0c;将不定期更新。 本章节提供OPC系列技术博文的快速导航。 《OPC服务器简介和入门介绍》 《物联网平台如何为OPC服务器创造新生命力》 《OPC服务器开发之WtOPCSvr——开发文档&#xff08;1&#xff09;》 《OPC服…

自动控制原理学习--平衡小车的控制算法(二)

上一节 在matlab建模&#xff0c;这一节PID控制. 一、模型 直接先放一张matlab simulink的模型&#xff08;只有直线速度环和平衡环&#xff0c;串联PID&#xff09;&#xff0c;就在上一节的基础上加了两个PID。 二、PID控制 PID的好处就是可以不用动力学建模&#xff08;当…

Kubernetes学习-集群搭建篇(一) 搭建Master结点

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 集群搭建方式 3. 环境说明 4. 利用kubeadm初始化Ma…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

文件名长度调整:指定文件重命名长度,优化你的文件存储体验

在数字时代&#xff0c;文件存储和管理是我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着文件数量的增加&#xff0c;文件名长度的管理变得尤为重要。合理的文件名长度不仅可以提高文件检索的效率&#xff0c;还能优化整体的存储体验。 为什么文件名长度很重要&am…

【UnityRPG游戏制作】Unity_RPG项目_玩法相关※

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

使用DBeaver连接postgreSql提示缺少驱动

重新安装电脑之后用dbeaver链接数据库的时候&#xff0c;链接PG库一直提示缺少驱动&#xff0c;当选择下载驱动的时候又非常非常慢经常失败&#xff0c;尝试了一下更改源然后下载库驱动就非常快了&#xff0c;当然也包括dbeaver的自动更新。 方法&#xff1a;点击菜单栏【窗口…

Golang 开发实战day13 - Reciver Functions

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day13 - 接收…