Java数据结构与算法_链表

Java数据结构与算法_链表

     数组作为数据存储结构有一定的缺陷,在无序的数组中,搜索是低效的;而在有序数组中,插入效率又很低;不管在哪一种数组中删除效率都很低。况且一个数组创建后,它的大小不能改变,链表就能够解决数组插入、删除效率低问题。

     链表在表头插入和删除速度很快。仅需要改变一两个引用值,所以花费O(1)的时间。平均起来,查找、删除和指定节点后面插入都需要搜索链表中一般链接点,需要O(N)次比较。在数组中执行这些操作也需要O(N)次比较,但是链表任然要快一些,因为要插入和删除链接点时,链表不需要移动任何东西。

      链表是继数组后第二中使用得最广泛的通用存储结构。

 

下面的使用Java代码实现双向链表:

 

1:链表Interface

 

public interface ListX<E> {

	public int size(); // 表数据总数

	public boolean isEmpty(); // 是否为空
	
	 /**
     * Appends the specified element to the end of this list
	  * @param e Element will be appends to the list
	  * @return
	  */
	 boolean add(E e);
	 
	 /**
	  * Insert the element at the specified position in the list with specified element 
	  * @param index
	  * @param element
	  */
	 void add(int index, E element);
	 
	 /**
	  * Remove the element at the specified position in this list
	  * @param index
	  * @return
	  */
	 E remove(int index);
	 
	 
	 /**
	  * Removes the first element from the list 
	  * @param o
	  * @return
	  */
	 boolean removeFirst();
	 
	 /**
	  * Return the element at the specified position of list
	  * @param index
	  * @return
	  */
	 E get(int index);
	 
	 /**
	  * Return the element at the first position of list
	  * @param index
	  * @return
	  */
	 E getFirst();
	 
	 /**
	  * Return the element at the last position of list
	  * @return
	  */
	 E getLast();
	 
	 boolean contains(E e);
}

 

 

2:结点类Entry

      Entry是放在LinkedListX中的内部静态类

 

	/**
	 * 节点类, 代表链表中的每一个节点。 
	 * @author xusy
	 *
	 * @param <E>
	 */
	private static class Entry<E> {
		E element;
		Entry next;
		Entry previous;

		public Entry(E e, Entry<E> previous, Entry<E> next) {
			this.element = e;
			this.next = next;
			this.previous = previous;
		}
	}

 

 

3:链表LinkedListX
import java.util.NoSuchElementException;

public class LinkedListX<E> implements ListX<E> {
	private int size;
	private Entry header = new Entry<E>(null, null, null);

	public LinkedListX() {
		header.next = header.previous = header;
	}
	
	
	/**
	 * 节点类, 代表链表中的每一个节点。 
	 * @author xusy
	 *
	 * @param <E>
	 */
	private static class Entry<E> {
		E element;
		Entry next;
		Entry previous;

		public Entry(E e, Entry<E> previous, Entry<E> next) {
			this.element = e;
			this.next = next;
			this.previous = previous;
		}
	}

	public E getFirst() {
		if (size == 0)
			throw new NoSuchElementException();
		return (E) header.next.element;
	}

	public E getLast() {
		if (size == 0)
			throw new NoSuchElementException();
		return (E) header.previous.element;
	}

	public void addFirst(E element) {
		addBefore(element, header.next);
	}

	public void addLast(E element) {
		addBefore(element, header);
	}

	public boolean contains(E e) {
		int index = indexOf(e);
		return index != -1;
	}

	public E remove(Entry e) {
		e.previous.next = e.next;
		e.next.previous = e.previous;

		E element = (E) e.element;
		e.next = null;
		e.previous = null;
		e.element = null;

		size--;
		return element;
	}

	private int indexOf(E o) {
		int index = 0;
		if (o == null) {
			for (Entry e = header.next; e != header; e = e.next) {
				if (e.element == null)
					return index;
				index++;
			}
		} else {
			for (Entry e = header.next; e != header; e = e.next) {
				if (o.equals(e.element))
					return index;
				index++;
			}
		}
		return -1;
	}

	private void addBefore(E element, Entry entry) {
		Entry newEntry = new Entry<E>(element, entry.previous, entry);
		newEntry.next.previous = newEntry;
		newEntry.previous.next = newEntry;

		size++;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public boolean add(E e) {
		addLast(e);
		return true;
	}

	@Override
	public void add(int index, E element) {
		Entry entry = index(index);
		addBefore(element, entry);
	}

	private Entry index(int index) {
		if (index < 0 || index > size)
			throw new IndexOutOfBoundsException();

		Entry entry = header.next;
		while (index > 0) {
			entry = entry.next;
		}

		return entry;
	}

	@Override
	public E remove(int index) {
		Entry entry = index(index);
		return remove(entry);
	}

	@Override
	public boolean removeFirst() {
		if (size == 0)
			throw new NoSuchElementException();

		remove(header.next);

		return true;
	}

	@Override
	public E get(int index) {
		return (E) index(index).element;
	}

	public void insertSort(int[] array){
		int in,out,temp;
		for(out=1;out<array.length;out++){
			temp = array[out];
			in=out;
			while(in>0&&array[in]>temp){
				array[in]=array[in-1];
				in--;
			}
		array[in]=temp;
		}
	}
}

 

51单片机独立按键控制LED(二) 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。独立按键控制LED显示二进制。独立按键控制LED灯亮灭。独立按键控制LED状态。独立按键控制LED移位。 阅读详情

相关推荐

ECU-TEST新手入门:从软件申请到第一个测试包创建的完整保姆级流程

本文详细介绍了ECU-TEST软件从申请试用、安装配置到创建第一个测试包的完整流程。针对新手用户,提供分步指导,包括界面认知、测试组件添加、变量定义及执行结果分析,帮助快速掌握汽车电子测试工具的基本操作。特别说明试用授权的两种获取方式和安装注意事项。

weixin_30606461的博客 481

数据结构与算法Java版:链表的建立与查询

public class LinkedList { Node head; public static void main(String[] args) { LinkedList list=new LinkedList(); list.add(1); list.add(2); list.add(3); printList(list.head); list.findvalue(4

杂文集 134

别再死磕Excel了!用Vensim PLE免费版,30分钟搞定你的第一个系统动力学模型

本文介绍如何使用Vensim PLE免费版在30分钟内构建第一个系统动力学模型,无需编程或数学基础。通过个人储蓄增长案例,详细讲解因果回路图绘制、存量流量图创建及方程编写,帮助读者掌握动态系统建模与仿真技巧,适用于理财、项目管理等多种场景。

weixin_29045001的博客 328

Java之数据结构与算法:链表

链表单链表介绍单链表的特点单链表的应用实例思路和代码实现添加方法1测试添加方法2测试删除测试修改测试查找测试单链表面试题求单链表中有效节点的个数测试查找单链表中的倒数第k个结点(新浪面试题)测试单链表的反转(腾讯面试题)测试单链表完整代码双向链表介绍双向链表的应用实例思路和代码实现添加删除查找和修改测试双向链表完整代码 单链表介绍     在百度百科中是这样介绍链表的:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的

陈煜杰 218

【网络安全】Python代码审计高危函数与安全审计建议

Python 灵活且动态的特性使得开发便捷,但同时也带来了严重安全隐患。如果开发者缺乏安全意识,极易引入命令执行、反序列化漏洞及模板注入漏洞。本文总结了 Python 中常见的高危函数、模块和第三方库,并给出对应的审计建议及其原理解析,供安全研究人员和开发者参考。

等风来 416

【C语言】一文搞懂C语言文件操作

读写文件、文件相关库函数详解、文件缓冲区介绍

StackFrame 5656

Java数据结构与算法——单向链表

Java数据结构与算法——单向链表

贝尔摩德苦艾酒 6317

MeloTTS 生成 RKNN 模型

摘要: 本方案基于RK3588平台,利用RKNN工具链实现高效语音合成(TTS)。采用MeloTTS开源模型,支持中英文混合语音生成。部署流程包括:1) 导出ONNX模型;2) 转换为RKNN格式;3) 在RK3588开发板运行。关键步骤包含环境配置(RKNN Toolkit2≥1.4.0)、模型转换(非量化处理)及音频处理实现。方案充分发挥RK3588的NPU加速能力,适用于边缘设备语音合成场景

J。 347

Java数据结构与算法04——单向链表

标签 : Java 数据结构 算法 作者 : Maxchen 版本 : V1.0.0 日期 : 2020/4/1 1.单向链表——原理 假如我们现在要存放一些物品,但是没有足够大的空间将所有的物品一次性放下(电脑中使用链式存储不是因为内存不够先事先说明一下…,具体原因后续会说到),同时设定我们因为脑容量很小,为了节省空间,只能记住一件物品位置。此时我们很机智的找到了解决方案:存放物品时每放置一件...

MAXCHEN BLOG 345

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6479

Allegro基本规则设置指导书之Spacing Region

当网络需要在Region中需要按照自身的规则匹配时,可以创建Region Class来匹配。Region也支持Class to Class规则,点击ok即可。Allegro基本规则设置指导书之Spacing Region。下面介绍基本规则设置指导书之Spacing Region。给创建好的Region 匹配一个规则。空白的地方创建一个Region。

weixin_54787054的博客 564

Java数据结构与算法中级篇之栈、队列、链表

数据是基础,算法是灵魂 版权声明,本文来自门心叼龙的博客,属于原创内容,转载请注明出处。https://blog.youkuaiyun.com/geduo_83/article/details/86466640 源码下载地址:https://download.youkuaiyun.com/download/geduo_83/10913510 初级篇:Java数据结构与算法初级篇之数组、集合和散列表 中级篇:Ja...

门心叼龙的专栏 4769

C#上位机+TensorFlow Lite 轻量化AI模型部署实战(工业级完整版,低算力工控机首选)

工业自动化轻量化AI部署指南:C# + TensorFlow Lite实战 摘要:本文针对工业自动化领域机器视觉部署的痛点,提出基于C#和TensorFlow Lite(TFLite)的轻量化解决方案。该方案完美适配低算力工控环境(J1900/2G内存),具有以下核心优势:1)极致轻量化,模型体积仅KB-MB级;2)CPU深度优化,单帧推理≤15ms;3)零环境依赖,纯C#部署;4)工业级稳定性,7×24小时运行。教程涵盖从环境搭建、模型转换到C#封装的完整流程,特别提供YOLOv8等工业常用模型的TFLi

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1030

数据结构与算法(java)--链表

学习记录

xiaoxin的博客 402

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java数据结构与算法之链表删除操作

一、链表的定义 链表是数据结构中线性结构中最为重要的数据结构,关于Java链表的定义以及数据实例化,请查看数据结构之数组和链表(Java语言描述)。 二、删除元素操作 在介绍删除元素之前,我先对数据进行进行节点实例化。首先,我们建立n1、n2和n3的三个节点,其中n1的后继节点是n2,n2的后继节点是n3。下面我将介绍删除元素的操作 class ListNode{ int val; //节点值 ListNode next; //后续节点使用 ListNode(int x){val=x;} } Lis

m0_43405302的博客 919

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 数据结构和算法(七):链表

Java数据结构和算法(七)——链表   前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷。在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造成内存的浪费,过小又不能满足数据量的存储。   本篇博客我们将讲解一种新型的数据结构——链表。我们知道数组是一种通用的数据结构,能用来实现栈、队列等很多数据结构。而链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈、队列等数据结构的基础,基本上除非.

dd2016124的博客 275

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java实现数据结构与算法-链表与双向链表

刚刚走上工作岗位,准备复习一下之前学过的数据结构和算法,把在北邮和国大学过的知识梳理一下,想想之前并没有用Java实现过数据结构和算法,之前只用的C。之后工作大部分就与Java打交道了,而且还会接触云计算还有数据挖掘什么的。所以,在这里献一下丑,用Java实现一些基本的和复杂的数据结构还有算法,希望大家多多指正啦! 1.链表: 我的理解,链表相较于普通数组的优势主要在于插入和删除一个节点比较快

zhxhash的博客 752

算法与数据结构-链表 讲解与java代码实现

1.链表基础 从左到右,使用两个指针进行性翻转 空间复杂度最优解可以做到O(1) 2.例题 1. 有序环形链表插入节点 import java.util.*; /* public class ListNode { int val; ListNode next = null; ListNode(int val) {

bury_的博客 537

Java数据结构和算法-链表、递归、高级排序

Java数据结构和算法(七)——链表 前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷。在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造成内存的浪费,过小又不能满足数据量的存储。 1、链表(Linked List) 链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接(“links”)   链表(Linked list)是一种常见的

julinglan7642的博客 337

Java 数据结构和算法 链表

链表 本章将学习一种全新的数据结构,链表。 链表的 机制灵活,用途广泛,它适用于许多通用的数据库,它也可以取代数组,作为其他存储结构的基础,例如栈、队列等等。除非需要频繁的通过下标随机访问各个数据,否则在很多实用数组的地方都可以用链表代替。 链结点 在链表中,每个数据项被包含在链结点中,一个链结点是某个类的对象,这个类可以叫做 Link ,因为一个链表中有许多类似的链结点,所有有必要用

不二 786

Java 中的数据结构和算法,第 5 部分:双向链表

使用双向链表和循环链表及其算法进行高级搜索和排序

ITnababy的博客 292

java 数据结构和算法_5_链表01

java 数据结构和算法_5_链表01

love2000118的专栏 122

【Java 数据结构与算法 02】链表

本文为学习 Java 数据结构与算法所记录,主要内容为 链表 的原理,链表的分类与应用,Josephu 问题及其代码实现

qq_44153697的博客 374

JAVA数据结构与算法——链表篇

Java数据结构与算法: https://blog.youkuaiyun.com/weixin_46822367/article/details/115478461?spm=1001.2014.3001.5502. 目录1、单向链表2、双向链表3、环形链表和约瑟夫问题 1、单向链表 package com.lyp.linkedlist; import java.util.Stack; public class SingleLinkedListDemo { public static void main(St.

weixin_46822367的博客 218

数据结构与算法【Java】02---链表

数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码。我会用数据结构与算法【Java】这一系列的博客记录自己的学习过程,如有遗留和错误欢迎大家提出,我会第一时间改正!!!接下来进入正题!链表是有序的列表,但是它在内存中是存储如下使用带 head 头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作第一种方法在添加英雄时,直接添加到链表的尾部思路分析示意图:代码实现: //添加节点到单向链表(在

AS011x的博客 163

Java数据结构与算法——链表

一:链表介绍: 链表是有序的列表,但是它在内存中是存储如下 总结: 1)链表是以节点的方式来存储,是链式存储 2)每个节点包含 data 域, next 域:指向下一个节点. 3)如图:发现链表的各个节点不一定是连续存储. 4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 二:单链表: 单链表(带头结点) 逻辑结构示意图如下 单链表的应用实例: 使用带head头的单向链表实现 ...

ELSA001的博客 306
上一篇: 简单算法
下一篇: spring学习资料和知识库集锦
justdojava
博客等级 码龄17年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值