目录

一、常见的链表题目练习(续)

  1、链表的回文结构。

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

3、给定一个链表,判断链表中是否有环。

4、给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

 二、LinkedList

1、LinkedList的模拟实现

2、LinkedList的使用

2.1什么是LinkedList

2.2LinkedList的使用

2.2.1LinkedList的构造

2.2.2LinkedList的其他常用方法介绍

2.2.3LinkedList的遍历

3、ArrayList和LinkedList的区别


      续接上一话

一、常见的链表题目练习(续)

  1、链表的回文结构。

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

        和前面一样,先使用快慢指针找到中间结点,再用第2题的方法将整个链表进行反转,再依次进行比较,看是否完全相同

public boolean chkPalindrome() {// write code hereif(head == null) return true;ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}//slow 指向的位置 就是中间节点//2.进行翻转ListNode cur = slow.next;while (cur != null) {ListNode curN = cur.next;cur.next = slow;slow = cur;cur = curN;}//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;}

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

(160. 相交链表 - 力扣(LeetCode))

        这里首先要清楚,两个链表如果有着公共结点,那么一定是Y字型的关系

        小技巧:如果两个链表相交,那么同时出发,依次向后走一步,若是为空下一步走到另一个链表的头结点上,他们相遇时一定是在公共结点位置。(不相交则同时为null)

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null) {return null;}ListNode pA = headA, pB = headB;while (pA != pB) {pA = ((pA == null) ? headB : pA.next);pB = ((pB == null) ? headA : pB.next);}return pA;}
}

3、给定一个链表,判断链表中是否有环。

(141. 环形链表 - 力扣(LeetCode))

        这里依旧采用快慢指针,如果有环,那么一定会相遇,若是没有环,则快指针一定会先null

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

        那么,为什么我们要让fast和slow分别走2步和1步呢?能不能一个走3步,一个走2步呢?

        首先要明确,若是一个走3步一个走1步,快指针可能刚好将慢指针进行套圈,永远无法相遇(如环的长度只有2,一个走3步一个走1步刚好永远无法相遇!!!)

        而若是一个走3步,一个走2步,那么就会存在不确定性,如不确定什么时候可以相遇等。

4、给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

(142. 环形链表 II - 力扣(LeetCode))

        依旧使用快慢指针操作,当两个指针相遇时,快指针走的距离是a+n(b+c)+b=a+(n+1)b+nc

        快指针的速度是慢指针的一倍,所以a+(n+1)b+nc=2(a+b) ==> a=c+(n−1)(b+c),我们会发现:从相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离。

        因此,当发现 slow 与 fast 相遇时,我们再额外使用一个指针 ptr。起始,它指向链表头部;随后,它和 slow 每次向后移动一个位置。最终,它们会在入环点相遇。

public class Solution {public ListNode detectCycle(ListNode head) {if (head == null) {return null;}ListNode slow = head, fast = head;while (fast != null) {slow = slow.next;if (fast.next != null) {fast = fast.next.next;} else {return null;}if (fast == slow) {ListNode ptr = head;while (ptr != slow) {ptr = ptr.next;slow = slow.next;}return ptr;}}return null;}
}

 二、LinkedList

1、LinkedList的模拟实现

 // 无头双向链表实现public class MyLinkedList {//头插法public void addFirst(int data) {ListNode node = new ListNode(data);if(head == null) {head = last = node;}else {node.next = head;head.prev = node;head = node;}}//尾插法public void addLast(int data) {ListNode node = new ListNode(data);if(head == null) {head = last = node;}else {last.next = node;node.prev = last;last = last.next;}}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index, int data) {int len = size();if(index < 0 || index > len) {return;}if(index == 0) {addFirst(data);return;}if(index == len) {addLast(data);return;}ListNode node = new ListNode(data);ListNode cur = findIndex(index);node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}private ListNode findIndex(int index) {ListNode cur = head;while (index != 0) {cur = cur.next;index--;}return cur;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key) {ListNode cur = head;while (cur != null) {if(cur.val == key) {return true;}cur = cur.next;}return false;}//删除第一次出现关键字为key的节点public void remove(int key) {ListNode cur = head;while (cur != null) {if(cur.val == key) {//开始删除if(cur == head) {head = head.next;if(head != null) {head.prev = null;}}else {cur.prev.next = cur.next;if(cur.next == null) {last = last.prev;}else {cur.next.prev = cur.prev;}}return;}cur = cur.next;}}//删除所有值为key的节点public void removeAllKey(int key) {ListNode cur = head;while (cur != null) {if(cur.val == key) {//开始删除if(cur == head) {head = head.next;if(head != null) {head.prev = null;}}else {cur.prev.next = cur.next;if(cur.next == null) {last = last.prev;}else {cur.next.prev = cur.prev;}}}cur = cur.next;}}//得到单链表的长度public int size() {ListNode cur = head;int count = 0;while (cur != null) {count++;cur = cur.next;}return count;}public void display() {ListNode cur = head;while (cur != null) {System.out.print(cur.val+" ");cur = cur.next;}System.out.println();}public void clear() {ListNode cur = head;while (cur != null) {ListNode curN = cur.next;cur.prev = null;cur.next = null;cur = curN;}head = last = null;}}

2、LinkedList的使用

2.1什么是LinkedList

        LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的结点中,然后通过引用将结点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

#注:

(1)LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问

(2)LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)

(3)LinkedList比较适合任意位置插入的场景

2.2LinkedList的使用

2.2.1LinkedList的构造

 public static void main(String[] args) {// 构造一个空的LinkedListList<Integer> list1 = new LinkedList<>();List<String> list2 = new java.util.ArrayList<>();list2.add("JavaSE");list2.add("JavaWeb");list2.add("JavaEE");// 使用ArrayList构造LinkedListList<String> list3 = new LinkedList<>(list2);}
2.2.2LinkedList的其他常用方法介绍

public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);        // add(elem): 表示尾插list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println(list.size());System.out.println(list);// 在起始位置插入0list.add(0, 0);  // add(index, elem): 在index位置插入元素elemSystem.out.println(list);list.remove();        // remove(): 删除第一个元素,内部调用的是removeFirst()list.removeFirst();   // removeFirst(): 删除第一个元素list.removeLast();    // removeLast():  删除最后元素list.remove(1);       // remove(index): 删除index位置的元素System.out.println(list);// contains(elem): 检测elem元素是否存在,如果存在返回true,否则返回falseif(!list.contains(1)){list.add(0, 1);}list.add(1);System.out.println(list);System.out.println(list.indexOf(1));      // indexOf(elem): 从前往后找到第一个elem的位置System.out.println(list.lastIndexOf(1));  // lastIndexOf(elem): 从后往前找第一个1的位置int elem = list.get(0);    // get(index): 获取指定位置元素list.set(0, 100);          // set(index, elem): 将index位置的元素设置为elemSystem.out.println(list);// subList(from, to): 用list中[from, to)之间的元素构造一个新的LinkedList返回List<Integer> copy = list.subList(0, 3);   System.out.println(list);System.out.println(copy);list.clear();              // 将list中元素清空System.out.println(list.size());}
2.2.3LinkedList的遍历
 public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1);   // add(elem): 表示尾插list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println(list.size());// foreach遍历for (int e:list) {System.out.print(e + " ");}System.out.println();// 使用迭代器遍历---正向遍历ListIterator<Integer> it = list.listIterator();while(it.hasNext()){System.out.print(it.next()+ " ");}System.out.println();// 使用反向迭代器---反向遍历ListIterator<Integer> rit = list.listIterator(list.size());while (rit.hasPrevious()){System.out.print(rit.previous() +" ");}System.out.println();}

3、ArrayList和LinkedList的区别

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

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

相关文章

Kafa面试经典题--Kafka为什么吞吐量大,速度快

这是一个非常核心的面试题和技术问题。Kafka 的高吞吐量和速度并非来自某一项“银弹”技术,而是其架构设计中一系列精巧决策共同作用的结果。 一、核心思想:最大化利用底层硬件资源 Kafka 速度快的根本原因是,它的设计哲学是 “尽可能地避免不必要的开销,并将硬件(尤其是…

Stream API 新玩法:从 teeing()到 mapMulti()

1. 背景&#xff1a;Stream API 的演进 自 Java 8 引入 Stream API 以来&#xff0c;Java 的集合处理方式发生了质变。开发者可以用声明式风格实现复杂的数据转换与聚合。然而&#xff0c;随着应用场景多样化&#xff0c;社区逐渐发现一些“尴尬空缺”&#xff1a; 聚合时&…

STM32G4 SVPWM VF开环强拖电机

目录一、STM32G4 SVPWM VF开环强拖电机1 SVPWM1.1 SVPWM技术简介1.2 基于零序分量注入的SVPWM算法的实现2. VF开环强拖电机3. VF启动电机实验现象附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)一、STM32G4 SVPWM VF开环强拖电机 1 SVPWM 1.1 SVPWM技术简介 SVPWM控制策略…

产品运营必备职场通用能力及提升攻略,一文说明白

在互联网行业蓬勃发展的当下&#xff0c;产品运营岗位成为了连接产品、用户与商业目标的关键纽带。从用户增长到活动策划&#xff0c;从数据分析到跨部门协作&#xff0c;产品运营人员需具备多元化技能&#xff0c;才能在激烈竞争中崭露头角。随着企业对精细化运营与数据驱动决…

面试 总结(1)

面试总结 一、spring相关 1. Spring Security角色管理实现 在智慧种植虫害识别系统中&#xff0c;我实现了农户端和企业端的双角色权限控制&#xff0c;这一部分是这样实现的&#xff1a; MySQL 表时设计区分农户和企业的角色表与权限表。登录时&#xff0c;JWT 令牌包含用户 I…

串与数组:从字符处理到多维存储的数据结构详解

串&#xff08;字符串&#xff09;和数组是数据结构中的两个重要分支&#xff0c;它们在程序设计中承担着不同但互补的角色。串专门处理字符数据&#xff0c;而数组则提供了多维数据的存储和访问机制。本文将深入探讨这两种数据结构的理论基础、实现方法和核心算法。 文章目录1…

面试之JVM

类的生命周期 加载、链接、初始化&#xff08;是类的初始化&#xff09;、使用&#xff08;对象的初始化&#xff09;、卸载&#xff08;GC&#xff09; 链接&#xff1a;验证、准备、解析 类加载 JDK9的升级点&#xff1a;扩展类加载器改成了平台类加载器。 java中很多的包分…

webpack开发模式与生产模式(webpack --mode=development/production“, )

webpack开发模式与生产模式的区别webpack的development&#xff08;开发模式&#xff09;和production&#xff08;生产模式&#xff09;是两种常见的构建环境配置&#xff0c;主要区别体现在构建速度、代码优化和调试支持等方面。开发模式 (development)目标&#xff1a;注重开…

当自然语言遇上数据库:Text2Sql.Net的MCP革命如何重新定义开发者与数据的交互方式

想象一下&#xff0c;在IDE中对AI助手说"帮我找出本月销售额最高的前10个产品"&#xff0c;然后它不仅能理解你的意图&#xff0c;还能直接生成并执行SQL查询&#xff0c;返回准确结果——这不是科幻&#xff0c;而是Text2Sql.Net的MCP集成带来的现实。 &#x1f3af…

2025流程图模板和工具深度评测:AI如何提升绘图效率80%?

引言&#xff1a;流程图模板的价值革命 在数字化办公的浪潮中&#xff0c;流程图已从单纯的"业务说明工具"进化为跨部门协作的"视觉语言"。据智研咨询2025年报告显示&#xff0c;规范使用流程图模板可使团队沟通效率提升40%&#xff0c;错误率降低58%。无…

WebSocket实时通信系统——js技能提升

2. WebSocket实时通信系统 功能概述 实现完整的WebSocket通信系统&#xff0c;支持实时消息推送、连接管理、心跳检测和自动重连。 技术难点 WebSocket连接生命周期管理消息序列化和反序列化心跳机制和连接保活错误处理和重连策略多组件状态同步 实现思路 2.1 WebSocket管理器 …

Spring AI 入门指南:三步将AI集成到Spring Boot应用

无需深入AI底层实现&#xff0c;Java开发者也能快速构建智能应用本文将介绍如何使用 Spring AI 在 Spring Boot 项目中快速集成 AI 能力。通过三步操作——添加依赖、配置 API 凭证和编写调用代码&#xff0c;Java 开发者可以轻松构建 AI 应用。一、Spring AI 简介Spring AI 是…

OOM问题排查思路及解决方案

OOM问题原因&#xff1a; 根本原因是创建的对象数量超过JVM堆内存容量&#xff0c;且这些对象无法被GC回收场景&#xff1a; 1.本地缓存了用户态&#xff0c;用户量急剧上升导致内存溢出&#xff0c;如使用HashMap本地缓存10万用户数据&#xff0c;每 个用户对象约2KB&#xf…

梨花教育暖心鹏城:深圳市养老护理院里“时光绽放”,用声音点亮银发精神之光

2025年8月24日&#xff0c;在深圳这座充满活力与梦想的城市&#xff0c;一场温暖人心的公益活动在深圳市养老护理院温情上演。梨花教育策划并组织了“梨花・时光绽放”公益活动&#xff0c;旨在通过声音的魅力&#xff0c;为市养老护理院的老人们送去关怀与欢乐&#xff0c;丰富…

力扣100+补充大完结

力扣100分类一、Java基础代码模板1. 基础输入输出模板import java.util.Scanner;class Solution {public static int linkedListOperation() {// 链表操作实现return 0;}public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.next…

SSM从入门到实战:3.3 SpringMVC数据绑定与验证

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; &#x1f4d6; 本文概述 本文是SSM框架系列SpringMVC基础篇的第三篇&#xff0…

ctfshow_萌新web16-web20-----文件包含日志注入

_萌新web16解开md5?c36d_萌新web17-----文件包含禁用了php关键字&#xff0c;这个题禁了远程文件包含,进行日志注入发现日志中有user-agent信息&#xff0c;因此我们可以在user-agent中写入木马抓包burpsuitUser-agent:<?php eval($_POST[cmd])?>抓包然后连接蚁剑_萌新…

Flink的CheckPoint与SavePoint

Flink的Checkpoint&#xff08;检查点&#xff09;和Savepoint&#xff08;保存点&#xff09;是两种不同的状态快照机制&#xff0c;主要区别如下&#xff1a;1. ‌Checkpoint‌‌核心功能‌&#xff1a;周期性触发的容错机制&#xff0c;用于故障恢复时保证状态一致性57。‌触…

Ansible 自动化运维工具:介绍与完整部署(RHEL 9)

Ansible 自动化运维工具&#xff1a;介绍与完整部署&#xff08;RHEL 9&#xff09;Ansible 的介绍与安装 一、自动化运维的必要性 传统手动运维依赖图形/命令行界面、检查清单或记忆执行任务&#xff0c;存在以下核心问题&#xff1a; 易出错&#xff1a;易跳过步骤或执行错误…

构建生产级 RAG 系统:从数据处理到智能体(Agent)的全流程深度解析

文章目录一、 整体架构设计&#xff1a;迈向智能体&#xff08;Agent&#xff09;驱动的 RAG二、 数据准备与预处理&#xff1a;构建高质量知识库2.1 数据加载与初步提取2.2 多策略分块 (Multi-Strategy Chunking)逻辑分块&#xff1a;按故障章节和关键说明传统分块&#xff1a…