Java数据结构---链表的基本用法(如创建等基本使用方法)

目录

一、单链表

(1)addFirst

(2)addLast

(3)遍历

(4)get

(5)insert

(6)removeFirst

(7)remove

二、双向链表

(1)insert

(2)remove

(3)addLast

(4) removeLast

三、双向环形链表

(1)添加

(2)删除首部和尾部

(3)删除或者寻找对应值的节点


一、单链表


//单向链表类
public class LinkedList {//头指针private Node head=null;private static class Node{int value;Node next;public Node(int value,Node next){this.value=value;this.next=next;}}}

(1)addFirst

//头部添加元素public void addFirst(int value){head=new Node(value,head);}

(2)addLast

 //找到链表中的最后一个节点public Node findLast(){if(head==null){return null;//空链表}Node p;for(p=head;p.next!=null;p=p.next){}return p;}//向链表尾部添加元素public void addLast(int value){Node last=findLast();if(last==null){addFirst(value);return;}last.next=new Node(value,null);}

(3)遍历

//遍历链表public void loop(){Node p=head;while(p!=null){System.out.print(p.value+" ");p=p.next;}System.out.println();}

(4)get

获取指定索引的节点的value值。

这里注意一下findNode方法是获取指定索引处的节点,所以需要一个计量器i,让这个i=0开始,为什么呢?因为head其实就是第一个节点,后面双向链表计量i是=-1开始的,但是双向链表中的head并不是第一个节点,它的next才是第一个节点,所以一定要特别注意单向链表中的head与双向链表的head的区别(个人看法)

//找到指定索引处的节点public Node findNode(int index){int i=0;for(Node p=head;p.next!=null;p=p.next,i++){if(i==index){return p;}}return null;//没有找到该节点}//获取指定索引处的节点的值(value)public int get(int index){Node p=findNode(index);if(p==null){throw new IllegalArgumentException(String.format("index[%d]不合法",index));}return p.value;}

(5)insert

//向索引位置插入public void insert(int index,int value){if(index==0){addFirst(value);}//找到上一个节点Node prev=findNode(index-1);if(prev==null){throw new IllegalArgumentException(String.format("index[$d]不合法",index));}prev.next=new Node(value,prev.next);}

(6)removeFirst

//删除第一个节点public void removeFirst(){if(head==null){throw new IllegalArgumentException(String.format("index[0]不合法"));}head=head.next;}

(7)remove

  //删除指定索引处的节点public void remove(int index){if(index==0){removeFirst();return;}Node prev=findNode(index-1);//上一个节点if(prev==null){throw new IllegalArgumentException(String.format("索引异常"));}Node removed=prev.next;//被删除的节点if(removed==null){throw new IllegalArgumentException(String.format("索引异常"));}prev.next=removed.next;}

二、双向链表

//双向链表类
public class DoubleLinkedList {private Node head;private Node tail;private static class Node{Node prev;int value;Node next;public Node(Node prev,int value,Node next){this.prev=prev;this.value=value;this.next=next;}}//初始化public DoubleLinkedList(){head=new Node(null,100,null);tail=new Node(null,999,null);head.next=tail;tail.prev=head;}}

(1)insert

在指定索引处添加

//找到指定索引处的节点private Node findNode(int index){int i=-1;for(Node p=head;p!=tail;i++,p=p.next){if(i==index){return p;}}return null;}//向指定位置添加节点public void insert(int index,int value){Node prev=findNode(index-1);if(prev==null){throw new IllegalArgumentException(String.format("索引异常"));}Node next=prev.next;Node inserted=new Node(prev,value,next);prev.next=inserted;next.prev=inserted;}

(2)remove

删除指定索引处的节点

//删除指定索引处的节点public void remove(int index){Node prev=findNode(index-1);if(prev==null){throw new IllegalArgumentException(String.format("索引异常"));}Node removed=prev.next;//如果删除的元素是尾哨兵if(removed==tail){throw new IllegalArgumentException(String.format("索引异常"));}Node next=removed.next;prev.next=next;next.prev=prev;}

(3)addLast

 向尾部添加节点

 //向尾部添加元素public void addLast(int value){Node last=tail.prev;Node added=new Node(last,value,tail);last.next=added;tail.prev=added;}

(4) removeLast

//删除最后一个节点public void removeLast(){Node removed=tail.prev;if(removed==head){throw new IllegalArgumentException(String.format("索引异常"));}Node prev=removed.prev;prev.next=tail;tail.prev=prev;}

三、双向环形链表

 双向环形链表(我这里说的是有哨兵节点的)不同的地方在于,尾结点的next指向了哨兵节点,哨兵节点的next指向的是第一个节点,哨兵节点的prev指向的是尾节点。

//双向环形链表
//注意是有哨兵节点sentinel
//sentinel.next是第一个节点,sentinel.prev是最后一个节点public class DoubleSentinelList {private static class Node{Node prev;int value;Node next;public Node(Node prev, int value, Node next) {this.prev = prev;this.value = value;this.next = next;}}private Node sentinel=new Node(null,-1,null);//哨兵节点//初始化public DoubleSentinelList(){sentinel.next=sentinel;sentinel.prev=sentinel;}
}

(1)添加

//向首部添加public void addFirst(int value){Node a=sentinel;Node b=sentinel.next;Node added=new Node(a,value,b);a.next=added;b.prev=added;}//向尾部添加public void addLast(int value){Node a=sentinel.prev;Node b=sentinel;Node added=new Node(a,value,b);a.next=added;b.prev=added;}

(2)删除首部和尾部

 //删除首部public void removeFirst(){Node removed=sentinel.next;if(removed==sentinel){throw new IllegalArgumentException(String.format("非法"));}Node a=sentinel;Node b=removed.next;a.next=b;b.prev=a;}//删除尾部public void removeLast(){Node removed=sentinel.prev;if(removed==sentinel){throw new IllegalArgumentException(String.format("非法"));}Node a=removed.prev;Node b=sentinel;a.next=b;b.prev=a;}

(3)删除或者寻找对应值的节点

//根据值寻找对应的节点public Node findByValue(int value){Node p=sentinel.next;while(p!=sentinel){if(p.value==value){return p;}p=p.next;}return null;}//根据值删除对应的节点public void removeByValue(int value){Node removed=findByValue(value);if(removed==null){return;//不用删除,因为没找到}Node a=removed.prev;Node b=removed.next;a.next=b;b.prev=a;}

 

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

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

相关文章

网络故障问题一般性检查排查思路

一、基本连通性检查 在网络中ping是一个十分强大的TCP/IP工具。它可以用来检测网络的连通情况和分析网络速度、也可以ping网址根据域名得到服务器IP、同时我们根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 ping 网址,有几种输出情况&a…

Linkage Mapper 工具参数详解——Centrality Mapper

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响,并介绍了如何解释模型输出结果和输出参数,适合刚入手的人。篇幅很长很啰嗦,是因为每个参数都解释的万分细致。 从以下链接中获取内容&…

软件测试基础理论学习-常见软件开发模型

瀑布模型 背景 瀑布模型的概念最早在1970年由软件工程师Winston W. Royce在其论文《Managing the Development of Large Software Systems》中提出。Royce虽然没有明确提出“瀑布模型”这个术语,但他描述了一种线性的、阶段性的开发流程,各个阶段之间具…

Windows系统中Wireshark抓包工具的安装使用

在使用Windows服务器时,如果我们发现网络流量异常或存在异常的外发数据包行为,我们可以利用抓包工具来捕获网络流量包,并对这些流量包进行特征分析,以查看其来源和目的地。通过这些信息,我们可以进一步诊断问题。 以下…

Resilience4j相关问题及答案(2024)

1、什么是Resilience4j,与Hystrix有何不同? Resilience4j是一个为Java 8和函数式编程设计的故障恢复库,它主要利用了Vavr库中的函数式编程概念。Resilience4j提供了一系列的故障恢复机制,包括断路器(Circuit Breaker&…

Linux下NUMA 内存管理初步理解

LINUX 系统在多核下,以及NUMA架构技术下 如何管理物理内存? 经过初步了解 发现系统对内存有以下工作 1 映射 2 内存碎片 3 内存回收 4 内存池 5 冷热页 6 水位线和保留内存 7 支持内存条热插拔 8 大页管理 这些功能给人感觉,尤其是DBA感觉是重新实现了数据缓存池的功…

EG网关网口连接触控一体机操作说明V1.0 20210809

前言:工业现场中,很多情况下都会使用触摸屏连接PLC这一套设备,此一体机是将触摸屏和PLC两款设备集成到一起,可以简化现场设备结构,方便维护。同时,使用蓝蜂 EG系列网关,可以实现远程在线监控数据…

代码随想录算法训练营第十五天| 二叉树 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 层序遍历 本题用层序遍历可以直接秒了&#xff0c;直接提取每一层中最左边的元素&#xff08;i0&#xff09;&#xff0c;然后保存到最后一层即可。 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;int…

四、C#高级特性(异步编程与Task)

在C#中&#xff0c;异步编程和Task是两个非常重要的高级特性&#xff0c;它们可以帮助你编写更高效、更可伸缩的代码。下面是对这两个特性的详细介绍&#xff1a; 异步编程 异步编程允许你编写看起来像同步代码的代码&#xff0c;但实际上它是非阻塞的&#xff0c;可以继续执…

Java学习苦旅(十七)——栈和队列

本篇博客将详细讲解Java中的栈和队列。 文章目录 栈概念Java中Stack常用方法代码实现 队列概念队列常用方法对比QueueDeque 代码实现Queue 结尾 栈 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一…

惊呆:RocketMQ顺序消息,是“4把锁”实现的(顺序消费)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多关于RocketMQ 的、很重要的面试题&#xff1a; 如何保证RocketMQ消息有序&#xff1f; Ro…

应用层网络协议

tags: [“计算机网络”] descripution: “学习应用层的一些常用协议” 网络协议&#xff1a;约定的信息传输的格式&#xff0c;如几个字节是消息头、消息头记录什么信息之类的&#xff1b;c/s架构&#xff1a;不一定是两台计算机&#xff0c;而是两个应用、两个端口工具&#…

poium测试库之JavaScript API封装原理

为什么要封装JavaScript的API&#xff1f; 因为有些场景下Selenium提供的API并不能满足我们需求。比如&#xff0c;滑动浏览滚动条&#xff0c;控制元素的显示/隐藏&#xff0c;日历控件的操作等&#xff0c;都可以通过JavaScrip实现&#xff0c;而且Selenium为我们提供了 exe…

Unity组件开发--事件管理器

1.创建单例脚本&#xff1a;SingletonBase public class SingletonBase<T> where T : new() {private static T instance;// 多线程安全机制private static readonly object locker new object();public static T Instance{get{if (instance null){//lock写第一个if里…

教你直接在 Midjourney 网站上创建图像

经过一年多的工作和使用 Midjourney 的乐趣&#xff0c;我们终于能够直接在网站上生成图像。许多以前没有使用过 Discord 的人对于只能在 Discord 上创建图像并不满意。现在&#xff0c;几乎所有人的等待终于结束了。 直接在 Midjourney 网站上生成图像 David Holz 在 Discor…

JAVA并发编程入门之-闭锁、信号量、栅栏

文章目录 一、闭锁CountDownLatchFutureTask 二、信号量Semaphore 三、栅栏(Barrier)CyclicBarrier(循环栅栏) 一、闭锁 闭锁是一种同步工具类&#xff0c;可以延迟线程的进度直到其到达终止状态&#xff1b;闭锁的作用相当于一扇门&#xff0c;在闭锁到达结束状态之前&#x…

SSM电影售票管理系统----计算机毕业设计

项目介绍 管理员角色包含以下功能&#xff1a; 管理员登陆,管理员用户管理,新闻公告增删改查,电影类型增删改查,影院信息增删改查,电影信息增删改查,订单查询,电影评价管理等功能。 用户角色包含以下功能&#xff1a; 用户首页,用户登录,查看电影详情,加入购物车,下单电影票,…

数据结构:图详解

图的存储方式 邻接矩阵 首先先创建图&#xff0c;这一个我们可以使用邻接矩阵或者邻接链 表来进行存储&#xff0c;我们要实现的无向图的创建&#xff0c;我们先创建 一个矩阵尺寸为n*n&#xff0c;n为图中的节点个数如图所示 可以看出图中有5个结点&#xff0c;那我们创建…

基于web3.js和ganache实现智能合约调用

目的&#xff1a;智能合约发布到本地以太坊模拟软件ganache并完成交互 准备工作&#xff1a; web3.jsganache模拟软件 ganache参数配置 从ganache获取一个url&#xff0c;和一个账号的地址&#xff0c; url直接使用图中的rpc server位置的数据即可 账号address从下列0x开头…

【Java】java -jar 读取jar包之外的yml

需求描述 springboot项目接入nacos配置&#xff0c;代码中使用bootstrap.yml来指定nacos信息&#xff0c;为了防止不同环境的来回切换&#xff0c;服务器中都单独在放一个bootstrap.yml&#xff0c;来指定具体环境的nacos配置&#xff0c;如sit服务器使用sit的nacos配置&#…