【数据结构二】链表和LinkedList详解

目录

链表和LinkedList

 1.链表的实现

2.LinkedList的使用

3.ArrayList和LinkedList的区别

4.链表OJ题训练


链表和LinkedList

        当 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后
搬移,时间复杂度为 O(n) ,效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多的场景。链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。

 1.链表的实现

链表结构有三种情况,可以相互组合共八种链表结构。

  1. 单向或双向
  2. 带头或不带头(头结点一般装链表长度信息)
  3. 循环或非循环

下面是无头单向非循环链表的实现:

public class MyLinkedList {class LinkedNode{int val;LinkedNode next;public LinkedNode(int val){this.val=val;}}LinkedNode head;// 1、无头单向非循环链表实现//头插法public void addFirst(int data){if(head==null){head.val=data;}else{LinkedNode node=new LinkedNode(data);node.next=head;head=node;}}//尾插法public void addLast(int data){LinkedNode cur=head;if(head==null){head.val=data;}else{while (cur.next!=null){cur=cur.next;}LinkedNode node=new LinkedNode(data);cur.next=node;}}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data){LinkedNode cur=head;if(head==null){head.val=data;}else{if(index<1||index>size()){System.out.println("插入位置不合法");}else{index--;while (index>0){cur=cur.next;index--;}LinkedNode node=new LinkedNode(data);node.next=cur;if(index==1){head=node;}}}}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){LinkedNode cur=head;if(head==null){return false;}else{while (cur.next!=null){if(cur.val==key){return true;}cur=cur.next;}if(cur.val==key){return true;}return false;}}//删除第一次出现关键字为key的节点public void remove(int key){if(head!=null){if(head.val==key){head=head.next;return;}LinkedNode cur=head.next;LinkedNode prev=head;while (cur!=null&&cur.next!=null){if(cur.val==key){prev.next=cur.next;return;}cur=cur.next;prev=prev.next;}System.out.println("沒有要刪除的元素");}}//删除所有值为key的节点public void removeAllKey(int key){if(head!=null){if(head.val==key){head=head.next;}LinkedNode cur=head.next;LinkedNode prev=head;while (cur!=null&&cur.next!=null){if(cur.val==key){prev.next=cur.next;}cur=cur.next;prev=prev.next;}System.out.println("沒有要刪除的元素");}}//得到单链表的长度public int size(){LinkedNode cur=head;int num=0;while (cur!=null){num++;cur=cur.next;}return num;}public void clear() {LinkedNode cur;while (head!=null){cur=head;head=head.next;cur.val=0;cur.next=null;}}//遍历public void display() {LinkedNode cur=head;while (cur!=null){System.out.print(cur.val+"\t");cur=cur.next;}}
}

2.LinkedList的使用

Java中的linked是一个双向链表,且实现了 Deque,Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。一些常见方法如下:

方法解释
boolean add (E e)
尾插 e
void add (int index, E element)
e 插入到 index 位置
boolean addAll (Collection<? extends E> c)
尾插 c 中的元素
E remove (int index)
删除 index 位置元素
boolean remove (Object o)
删除遇到的第一个 o
E get (int index)
获取下标 index 位置元素
E set (int index, E element)
将下标 index 位置元素设置为 e
void clear ()
清空
boolean contains (Object o)
判断 o 是否在线性表中
int indexOf (Object o)
返回第一个 o 所在下标
int lastIndexOf (Object o)
返回最后一个o的下标
List<E> subList (int fromIndex, int toIndex)
截取部分list

3.ArrayList和LinkedList的区别

4.链表OJ题训练

下面给出牛客或者力扣的经典题型,重复练习对加深知识点很有帮助

  1. 反转一个单链表。
  2. 链表的回文结构。
  3. 输入两个链表,找出它们的第一个公共结点。
  4. 给定一个链表,判断链表中是否有环。
  5. 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

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

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

相关文章

软件测试|sqlalchemy一对一关系详解

简介 SQLAlchemy 是一个强大的 Python ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许我们将数据库表映射到 Python 对象&#xff0c;并提供了丰富的关系模型来处理不同类型的关系&#xff0c;包括一对一关系。在本文中&#xff0c;我们将深入探讨 SQLAlchemy …

【Linux 命令】tree 对目录进行树形展示

目录 1、tree 命令功能展示 2、tree 命令安装 3、tree 命令语法及其参数功能 4、终止 tree 展开树命令 1、tree 命令功能展示 在 Linux 中&#xff0c;我们使用 ll 命令对目录的展示并不太方便我们查看&#xff0c;不太清晰明了&#xff0c;所以我们可以使用 tree 命令以…

JavaScript的代码执行顺序

&#xff08;1&#xff09;. js的执行顺序&#xff0c;先同步后异步 &#xff08;2&#xff09;. 异步中任务队列的执行顺序&#xff1a; 先微任务microtask队列&#xff0c;再宏任务macrotask队列 注意&#xff0c;按顺序从上到下时&#xff0c;没有轮到执行的任务会进入相应…

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中&#xff0c;使用 aop 增强&#xff0c;不仅可以很优雅地扩展功能&#xff0c;还可以让一写多用&#xff0c;避免写重复代码&#xff0c;例如&#xff1a;记录接口耗时&#xff0c;记录接口日志&#xff0c;接口权限&…

LeetCode、162. 寻找峰值【中等,最大值、二分】

文章目录 前言LeetCode、162. 寻找峰值【中等&#xff0c;最大值、二分】题目及类型思路及代码思路1&#xff1a;二分思路2&#xff1a;寻找最大值 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿…

链表的分割

链表的分割 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/partition-list-lcc…

LeetCode讲解篇之2280. 表示一个折线图的最少线段数

文章目录 题目描述题解思路题解代码 题目描述 题解思路 折线图中如果连续的线段共线&#xff0c;那么我们可以可以将其合并成一条线段 首先将坐标点按照横坐标升序排序 然后遍历数组 我们可以通过计算前一个线段的斜率和当前线段的斜率来判断是否共线 如果二者相等&#x…

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1&#xff09;Dcm和PduR的交互2&#xff09;Dcm和ComM模块的交互3&#xff09;Dcm和Dem的交互4&a…

网络安全最大的威胁:洞察数字时代的风险之巅

在数字化时代&#xff0c;网络安全问题越发突显&#xff0c;企业和个人都面临着来自多方面的威胁。究竟网络安全领域的最大威胁是什么&#xff1f;本文将深入探讨这一问题&#xff0c;揭示数字空间中最为严重的威胁。 1. 恶意软件的肆虐&#xff1a; 恶意软件一直是网络安全的…

LeetCode、374. 猜数字大小【简单,二分】

文章目录 前言LeetCode、374. 猜数字大小【简单&#xff0c;二分】题目及类型思路及代码实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技…

【深度学习每日小知识】Artificial Intelligence 人工智能

人工智能 (AI) 是一个快速发展的领域&#xff0c;有潜力改变我们的生活和工作方式。人工智能已经为从自动驾驶汽车到个性化医疗等各个行业做出了重大贡献。然而&#xff0c;与任何新技术一样&#xff0c;人工智能也存在许多问题和担忧。在这里&#xff0c;我们将探讨有关人工智…

音频筑基:时延、帧长选取的考量

音频筑基&#xff1a;时延、帧长选取的考量 帧长与时延的关系帧长变化的影响参考资料 音频算法中&#xff0c;时延和音频帧长的选择通常是个需要平衡的参数&#xff0c;这里分析下背后的考量因素。 帧长与时延的关系 一般来说&#xff0c;帧长是音频算法端到端时延的子集&…