链表以及双向链表的增删改查

链表---双向链表之节点的增删改查 双向链表: 双向链表是在单向链表的基础上,在每个节点上加了一个向前的指针。这俩个指针分别指向直接后继和直接前驱,使得双向链表更加方便。 Java代码实现: (代码中有注释) public class DoubleLinkedlistDemo { public static void main(String[] args) { // TODO Auto-generated method stub ... 阅读详情

链表是一种重要的数据结构,包含单向链表和双向链表:

1. 单向链表
单链表(单向链表):由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接,这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,这样一来就连成了上述所说绳子一样的链,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。

在这里插入图片描述

Linklist类:
package linklist;

public class Linklist {
	  // 用来存取该节点的数据,public修饰符不用get set方法  
	public int data = 99999999;   //数值
	// 用来存储下个节点
	public Linklist next; //节点
	/**
	 * 添加
	 * @param data 要添加的值
	 */
	public void add(int data) {
		//如果next为空,就给它赋值
		if(next ==null) { 
			next = new Linklist();
			next.data  = data;
		}else {
			//如果不为空,就让next去添加
			next.add(data);
		}
	}
	/**
	 * 删除
	 * @param data 要删除的数据
	 */
	public void delete(int data) {
		// 如果下一个为空,那么程序退出
		if(next == null) {
			return;
		}
		Linklist temp;
		temp = next;
		if(temp.data == data) {
			next = temp.next;
			temp.next = null;
		}else {
			next.delete(data);
		}
	}
	/**
	 * 查找
	 * @param data  要查找的数据
	 * @return
	 */
	public Linklist find(int data) {
		if(next == null) {
			return null;
		}
		if(next.data == data) {
			return next;
		}else {
			return next.find(data);
		}
		
	}     
	/**
	 * 更新
	 * @param data 更新数据
	 * @param newdata
	 */
	public void update(int data,int newData) {
		Linklist find = find(data);
		find.data = newData;
	}
	@Override
	public String toString() {
		return "Linklist [data=" + data + ", next=" + next + "]";
	}

}

LinklistTest类:
package linklist;

public class LinklistTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Linklist a = new Linklist();
        a.add(5);
        a.add(6);
        a.add(59);
        a.add(-5);
        a.add(9999999);
        a.add(58);
        a.add(-655);
              
        System.out.println(a);
        a.delete(58);
        Linklist b = a.find(59);
        System.out.println(b);
        Linklist c = a.find(-5);
        System.out.println(c);
        a.update(9999999, 99);
        System.out.println(a);
	}

}

运行结果:
在这里插入图片描述
2. 双向链表
双链表(双向链表):双链表和单链表相比,多了一个指向尾指针(tail),双链表的每个结点都有一个头指针head和尾指针tail,双链表相比单链表更容易操作,双链表结点的首结点的head指向为null,tail指向下一个节点的tail;尾结点的head指向前一个结点的head,tail 指向为null,是双向的关系;

在这里插入图片描述

DoublyLinkList类:
package com.wwy.linklist;

import java.io.IOException;

public class DoublyLinkList{
     //头
    private Link frist;
      //尾
    private Link last;
    //初始化首尾指针
    public DoublyLinkList(){
        frist = null;
        last = null;
    }

    public boolean isEmpty(){
        return frist == null;
    }

    public void addFrist(int value){
        Link newLink= new Link(value);
        // 如果链表为空
        if(isEmpty()){ 
            last = newLink; //last -> newLink
        }else {
            frist.pre = newLink; // frist.pre -> newLink
        }
        newLink.next = frist; // newLink -> frist
        frist = newLink; // frist -> newLink
    }

    public void addLast(int value){
        Link newLink= new Link(value);
         // 如果链表为空
        if(isEmpty()){
            frist = newLink; // 表头指针直接指向新节点
        }else {
            last.next = newLink; //last指向的节点指向新节点
            newLink.pre = last; //新节点的前驱指向last指针
        }
        last = newLink; // last指向新节点
    }

    public boolean addBefore(int key,int value){

        Link cur = frist;
        if(frist.next.val == key){
            addFrist(value);
            return true;
        }else {
            while (cur.next.val != key) {
                cur = cur.next;
                if(cur == null){
                    return false;
                }
            }
            Link newLink= new Link(value);
            newLink.next = cur.next;
            cur.next.pre = newLink;
            newLink.pre = cur;
            cur.next = newLink;
            return true;
        }
    }

    public void addAfter(int key,int value)throws RuntimeException{
        Link cur = frist;
        while(cur.val!=key){ //经过循环,cur指针指向指定节点
            cur = cur.next;
            if(cur == null){ // 找不到该节点
                throw new RuntimeException("Node is not exists");
            }
        }
        Link newLink = new Link(value);
        if (cur == last){ // 如果当前结点是尾节点
            newLink.next = null; // 新节点指向null
            last =newLink; // last指针指向新节点
        }else {
            newLink.next = cur.next; //新节点next指针,指向当前结点的next
            cur.next.pre = newLink; //当前结点的前驱指向新节点
        }
        newLink.pre = cur;//当前结点的前驱指向当前结点
        cur.next = newLink; //当前结点的后继指向新节点
    }

    public void deleteFrist(){
        if(frist.next == null){
            last = null;
        }else {
            frist.next.pre = null;
        }
        frist = frist.next;
    }

    public void deleteLast(int key){
        if(frist.next == null){
            frist = null;
        }else {
            last.pre.next = null;
        }
            last = last.pre;
    }

    public void deleteKey(int key)throws RuntimeException{
        Link cur = frist;
        while(cur.val!= key){
            cur = cur.next;
            if(cur == null){ //不存在该节点
                throw new RuntimeException("Node is not exists");
            }
        }
        if(cur == frist){ // 如果frist指向的节点
            frist = cur.next; //frist指针后移
        }else {
            cur.pre.next = cur.next;//前面节点的后继指向当前节点的后一个节点
        }
        if(cur == last){ // 如果当前节点是尾节点
            last = cur.pre; // 尾节点的前驱前移
        }else {
            cur.next.pre = cur.pre; //后面节点的前驱指向当前节点的前一个节点
        }
    }

    public int queryPre(int value)throws IOException,RuntimeException{
        Link cur = frist;
        if(frist.val == value){
            throw new RuntimeException("Not find "+value+"pre");
        }
        while(cur.next.val!=value){
            cur = cur.next;
            if(cur.next == null){
                throw new RuntimeException(value +"pre is not exeist!");
            }
        }

        return cur.val;
    }

    public void displayForward(){
        Link cur = frist;
        while(cur!=null){
            cur.displayCurrentNode();
            cur = cur.next;
        }
        System.out.println();

    }
    public void displayBackward(){
        Link cur = last;
        while(cur!=null){
            cur.displayCurrentNode();
            cur = cur.pre;
        }
        System.out.println();
    }
}


Test类:
package com.wwy.linklist;

import java.io.IOException;

public class Test {

	public static void main(String[] args) throws IOException, RuntimeException {
		// TODO Auto-generated method stub
	//	 public void test()throws Exception{ // 自己测试代码
		        DoublyLinkList d = new DoublyLinkList();
		        d.addFrist(1);
//		        d.addFirst(1);
		        d.addFrist(2);
		        d.addFrist(3);
		        d.addLast(6);
		        d.addFrist(4);
		        d.addFrist(5);
		        d.addLast(7);
		        d.displayForward();
		      
		 //       System.out.println(d.queryPre(4));
		  //      System.out.println(d.queryPre(2));
		        System.out.println(d.queryPre(3));
		        System.out.println(d.queryPre(7));
		        System.out.println(d.queryPre(6));
		      
		   d.addBefore(6, 9);
		   d.displayBackward();
		
		   d.deleteKey(3);
		   d.displayBackward();
		  
		      
		    }
		}

		class Link {
		    public int val;
		    public Link next;
		    public Link pre;

		    public Link(int val) {
		        this.val = val;
		    }

		    public void displayCurrentNode() {
		        System.out.print(val + "  ");
		    }
}

运行结果:
在这里插入图片描述

NTU RGB + D 120 动作识别数据集 描绘骨架(python) “ NTU RGB + D”和“ NTU RGB + D 120”。 “ NTU RGB + D”包含60个动作类别和56,880个视频样本。 “ NTU RGB + D 120”通过添加另外60类和另外57,600个视频样本来扩展“ NTU RGB + D”,即“ NTU RGB + D 120”总共有120类和114,480个样本。 这两个数据集都包含每个样本的RGB视频,深度图序列,3D骨骼... 阅读详情

相关推荐

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

【数据结构】链表——增、删、查、改

本文结束了链表的概念与使用,用图解的方式阐明了链表的增删查改,让我们一起来学习链表吧。

2301_77003537的博客 2975

告别手动打点!用Cesium为你的大疆无人机快速生成区域巡查航线(保姆级教程)

本文详细介绍了如何利用Cesium平台为大疆无人机快速生成区域巡查航线的保姆级教程。通过自动化航线规划,告别传统手动打点的繁琐操作,实现高效、无死角的区域覆盖。文章涵盖环境搭建、实战案例及高级优化技巧,特别适合无人机操作员和巡检工作者提升工作效率。

weixin_30399821的博客 519

【数据结构】链表-增删查改

链表是一种物理结构上非连续、非顺序的存储结构,数据元素的逻辑是通过链表中的指针链接次序实现的。 链表创建完成后不需要初始化,链表过于简单,就是由一个个的结构体通过指针域串起来的,在不存储数据的时候,可以没有任何节点,即没有结构体,在主函数中将指向结构体的指针置为空就行了。......

weixin_44930735的博客 3207

如何在RT-DETR-R18中修改ultralytics的yaml文件(附完整代码)

本文详细指导如何在RT-DETR模型中,通过修改Ultralytics框架的yaml配置文件,将Backbone从ResNet50轻量化替换为ResNet18。核心步骤包括自定义ResNet18基础模块、调整HybridEncoder的expansion参数至0.5,并协同修改检测头Decoder层数,最终提供完整的配置文件代码,助力开发者在资源受限环境下部署轻量级实时目标检测模型。

weixin_29091445的博客 288

【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系

多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。

一起来交流学习吧 1万+

单链表的增、删、改、查(图解)

C语言编程实现单链表的增、删、改、查等基本操作 ​ 二、链表和数组的区别 参考博客:链表(图文详解)_糊涂糖僧的博客-优快云博客_链表 1、数组静态分配内存,链表动态分配内存。故链表内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。...

pjwshuai的博客 4399

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

engchina的专栏 8624

【数据结构】链表的增删查改

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。注意:1.链式结构在逻辑上是连续的,但在物理上不一定连续2.现实中的结点一般都是从堆上申请出来的3.从堆上申请的空间,是按照一定的策略来分配,两次申请的空间,可能连续,也可能不连续。

烧鸡配油茶的博客 963

UCIE Specification详解(三)

Protocol Layer(协议层)以及Die-to-Die Adapter

Crazzy_M的博客 1758

嵌入式数字信号处理器(DSP)高频面试题及参考答案

数字信号处理器(DSP)是一种专门设计用于执行数字信号处理任务的微处理器。它具有高度优化的架构,能够高效地执行复杂的数学运算,如快速傅里叶变换(FFT)、卷积、滤波和其他信号处理算法。DSP通常具有高速的中央处理器、专用的硬件乘法器、累加器、硬件循环支持和高速的内存访问能力,以满足实时信号处理的需求。通信:用于调制解调、语音编码、数据压缩、加密和解密。音频处理:如音乐合成、音效增强、语音识别和语音合成。视频和图像处理:包括图像压缩、视频编码、图像增强和模式识别。生物医学工程。

大模型大数据攻城狮的专栏 5267

【数据结构】单链表的增删查改

在上一节中我们提到了顺序表有如下缺陷:在头部/中间的插入与删除需要挪动数据,时间复杂度为O(N),效率低;增容需要申请新空间,可能会拷贝数据,释放旧空间,会有不小的时间消耗;增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,如果我们再继续插入了5个数据,后面没有数据插入了,那么会浪费95个数据空间;基于顺序表的这些不足,我们设计出了链表。

StandDev的博客 635

EMS案例:BMS传导发射超标整改案例

BMS作为新能源汽车的关键部件,其EMC性能直接影响整车的安全性和可靠性。本文通过一个实际的传导发射整改案例,详细展示了从问题定位、分析到解决方案实施的全过程。希望这些经验能够为从事类似产品设计的工程师提供有价值的参考,在未来的产品开发中避免类似问题,设计出更加可靠、稳定的BMS产品。EMC设计是一门结合理论与实践的艺术,只有通过不断积累经验、深入理解电磁场理论,并紧密结合实际应用场景,才能在复杂的电磁环境中设计出鲁棒性强的电子产品。

m0_56451176的博客 272

双向链表增删改查分析

双向链表增删改查分析 单向链表的缺点 单向链表查找方向只能是一个方向,而双向链表可以向前或者向后查找。 单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点。(利用next机制) 示意图可以帮助理解删除 示意图 分析双向链表的遍历,添加,修改,删除的操作思路 遍历的方式和单链表...

孔祥月的博客 2988

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

双向链表实现增删改查的操作

更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢! 此篇是单向循环链表实现增删改查的操作,其中: "增"包括在链尾、链中增加节点 "删"包括在链头、链中、链尾删除单个或多个节点 "改"包括在链头、链中、链尾更改单个或多个节点数值 "查"只是显示整个链表所有节点数值 #include <stdio.h> #include <stdlib.h> //设置节点 struct node { int data;

佳佳鸽的博客 924

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

c语言双向链表增删改查,双向链表的增删改查和反向遍历

双向链表的增删改查和反向遍历双向链表的增删改查和反向遍历双向链表:一个节点中既有上一个节点的内存地址又有下一个节点的内存地址,还有数据域首先:我们需要一个节点类来展示节点信息:class HNode{public String name;public int no;//根据这个编号来查找,修改,删除,添加元素public HNode next;//下一个节点的信息public HNode pre;...

weixin_39517289的博客 472

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

实现一个双向链表的增删改查

        美好的一天从中午起床开始,睡懒觉真的太舒服了,然后我们要上传一份代码,实现双向链表的增删改,首先列出各个函数的功能:        void DLinkListInit(DLinkNode** head); 双向链表的初始化DLinkNode* DLinkListPushBack(DLinkNode* head, DLinkType value); 尾插一个元素void DLinL...

HanMamnHanah的博客 1552

【数据结构】双向链表(增删改查)

双向链表的增删改查同单向链表的增删改查比较: 头结点:head = new HeroNode(0,"",""); 真正的节点是头结点后面的节点进行增删改查 增(添加):双向链表的增是HeroNode temp = head;单向链表的增是HeroNode temp = head 删:双向链表自我删除, HeroNode temp = head.next; 单向链表需要找到待删除节点的前一节点,H...

JH灰色的博客 649

PHP实现双向链表的增删改查

PHP实现双向链表的增删改查 双向链表对比单项链表,有三部分组成: 指针 next,指向当前节点的下一个节点 指针 prev,指向当前节点的下一个节点 数据存储区 data, 当前节点的数据存储区 有两个指针,代表它更加复杂,同时也代表它比单项链表,既可以从头遍历,也可以从尾部遍历,更加灵活 示意图如下: 初始化一个节点类 主要数据 双向指针,以及节点数据 实例如下:...

LiYi 266

java双向链表的增删改查,顺序增加图文详解

文章目录前言一、双向链表是什么?二、案例1.节点类Node实现2.双向链表类DoubleLinkedLinst3.获取链表头,尾节点方法4.无脑增加方法add5.两个遍历方法(从头遍历和从尾遍历)6.修改节点upDate方法7删除方法delete()8.[重点菜]按顺序添加测试总结 前言 双向链表的增删改查,其中难点在于按顺序增加,如何保持节点中指向上一个节点的pre也能被修改成功 提示:以下是本篇文章正文内容,下面案例可供参考 一、双向链表是什么? 双向链表也叫双链表,是链表的一种,它的每个数据结.

临时抱不到佛脚的博客 916

java实现双向链表的增删改查

双向链表的增删改查 基本结构 1、增加操作 1、链接cur与pre和next,其中的next是pre的下一个节点 2、用cur重新连接 在尾部添加代码实现 //添加 从尾部添加 public void addEnd(Student1 student1){ Student1 temp=head1;//辅助 while(true){ if(temp.next==null){ break;

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 957

双向链表的增删改查(个人使用)

以下代码仅供参考,阅读时请先看NOTE,避免浪费时间 /** * @author: HCHO * @lastUpdateTime:2020/10/3 * @description: 双向链表的增删改查 */ /* NOTE: 所有代码仅供我个人学习使用,方法可能有误或者复杂化也有可能会有bug,读者请慎重操作 创建了一个头节点只是为了操作方便 在进行删除或增加的时候都应该考虑在最后一个节点操作时tail指针的改变所以引入双指针 上述情况造成的原因是我本人在建立链表时记录了尾节点的地址(为了逆序遍历

濡苏的博客 173

单向链表和双向链表的增删改查以及排序问题

本文介绍单向链表和双向链表的创建、排序、插入、删除、修改等操作!

西岸贤 583

双向链表的增删改查

Node* head;// 头节点指针Node* tail;// 尾节点指针int length;// 链表长度。

shanstellar的博客 738

java数据结构双向链表之算法增删改查

1.双向链表应用实例 使用带头的双向链表实现----水浒英雄排行榜。 实现增删改查操作! package Linkedlist.DoublelinkedList; public class DoubleLinkedListDemo { public static void main(String[] args) { //测试。创建节点 HeroNode2 heroNode1=new HeroNode2(1,"宋江"); ...

weixin_45519487的博客 308

java 双向链表 增删改查

双向链表的增删改查 class MM{ public static void main(String[] args){ doublelist list=new doublelist(); Node node1=new Node(1,"林冲"); Node node2=new Node(2,"吴用"); Node node3 =...

qq_39472229的博客 229
上一篇: 数据类型,创建函数,调用函数以及定义对象的3种语法
下一篇: Linux命令:ls命令
java_hwy
博客等级 码龄8年 6粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值