双向链表增删改查(有点问题顺序增加不到尾部)

图解链表 —— JAVA中的单链表基本操作 文章目录1. 什么是链表2. 链表的种类3. 创建单链表3.1 创建 Node 类(车厢类)3.2 创建 MySingleList (火车类)4. 单链表的基本操作4.1 增加链表元素4.1.1 在链表头部添加元素4.1.2 在链表任意位置添加元素4.1.3 在链表尾部添加元素4.2 删除链表元素4.2.1 删除第一个节点元素4.2.2 删除任意位置 index 元素4.2.3 删除链表中指定元素的第一个节点4.2.4 删除链表的所有指定元素4.3 查找链表元素4.3.1 判断链表中是否包含元素 data4 阅读详情
package com.linkedlist;

import java.util.SortedMap;

/**
 * @Auther: 大哥的叔
 * @Date: 2019/7/29 05:07
 * @Description:
 */
public class DoubleLinkedListDemo {
    public static void main (String[] args) {
        HeroNode2 hero1 = new HeroNode2(1,"1","1");
        HeroNode2 hero2 = new HeroNode2(2,"2","2");
        HeroNode2 hero3 = new HeroNode2(3,"3","3");
        HeroNode2 hero4 = new HeroNode2(4,"4","4");
        HeroNode2 hero5 = new HeroNode2(5,"5","5");
        HeroNode2 hero6 = new HeroNode2(4,"6","6");

        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        doubleLinkedList.add(hero2);
        doubleLinkedList.add(hero1);
        doubleLinkedList.add(hero3);
        doubleLinkedList.show();
        doubleLinkedList.addByorder(hero2);
        doubleLinkedList.show();
        doubleLinkedList.delete(2);
        doubleLinkedList.show();
        doubleLinkedList.update(hero6);
        doubleLinkedList.show();
    }
}

class DoubleLinkedList{
      private HeroNode2 head = new HeroNode2(0,"","");

      public HeroNode2 gethead(){
          return head;
      }
    //这种方式只能添加最后,而且没有判断依据如果重复添加一个会死循环
      public void add(HeroNode2 heroNode2){
          HeroNode2 temp = head;
          while (true){
              if (temp.next == null){
                  break;
              }
              //没有找到最后,temp后移
              temp = temp.next;
          }
          temp.next = heroNode2;
          heroNode2.pre = temp;
      }

      public void addByorder(HeroNode2 heroNode2){

          HeroNode2 temp = head.next;
          boolean flag = false;
          while (true){
              if(temp==null){
                  System.out.println("空");
                  break;
              }
              if(temp.next.no>heroNode2.no){//在编号内
                break;
              }else if (temp.next.no==heroNode2.no){
                  flag=true;
                  break;
              }
              temp =temp.next;
          }
          if (flag){
              System.out.println("已存在");
          } else {
              heroNode2.next = temp.next;
              temp.next= heroNode2;
         }
      }

      public void delete(int no){
        if (head.next==null){
            System.out.println("空");
            return;
        }
        HeroNode2 temp = head.next;
        boolean flag = false;
        while (true){
            if (temp==null){
               break;
            }
            if (temp.no==no){
                flag=true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            //temp前一个节点的后继节点指向temp的后继节点
            temp.pre.next = temp.next;
            if(temp.next != null){
                temp.next.pre = temp.pre;//后一个节点的前驱指向temp的前一个节点
            }
        }else {
            System.out.println("不存在");
        }

      }

      public void update(HeroNode2 newheroNode2){
          if (head.next ==null){
              System.out.println("空");
              return;
          }

          HeroNode2 temp = head.next;
          boolean flag = false;
          while (true){
              if (temp==null){
                  break;
              }
              if (temp.no==newheroNode2.no){
                  flag=true;
                  break;
              }
              temp = temp.next;
          }
          if (flag){
              temp.name = newheroNode2.name;
              temp.nickname = newheroNode2.nickname;
          }else {
              System.out.println("不存在");
          }
      }

      public void  show(){
          if (head.next==null){
              System.out.println("空");
              return;
          }
          HeroNode2 temp = head.next;
          while (true){
              if (temp==null){
                  System.out.println("遍历结束");
                  break;
              }
              System.out.println(temp);
              temp = temp.next;
          }

      }
}

class HeroNode2{
    public int no;
    public  String name;
    public String nickname;
    public HeroNode2 next;
    public HeroNode2 pre;

    public HeroNode2 (int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString () {
        return "HeroNode2{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}

 

双向链表的增删改查 实现双向链表的增删改查功能,dos窗口输入输出,可运行,有注释 立即下载

相关推荐

两个有序链表合并插入删除修改

两个有序链表合并 链表插入 删除 修改等

双向链表增删改查分析

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

孔祥月的博客 2988

【MDC开发者实战】多传感器融合算法在自动驾驶中的配置与优化

本文详细介绍了华为MDC平台在自动驾驶中多传感器融合算法的配置与优化实践。通过前融合与后融合技术,结合摄像头、激光雷达和毫米波雷达的数据,提升感知精度与可靠性。文章还分享了ARXML配置、标定技巧、算法调优及性能优化等实战经验,帮助开发者高效实现自动驾驶系统的传感器融合。

weixin_29214199的博客 515

【数据结构】之双向链表的复杂度分析

双向链表的复杂度分析 我们先看一下它的概念(来自百度百科): 它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 和单向链表不同的是,双链表除了有一个指向下一节点的指针外,还有一个指向前一节点的指针,这也就意味着,双向链表能够快速找到前驱节点,也能快速找到后驱节点。 和单向链表相比,对于插入或删除指定节点的操作,因为单向链表需要从头遍历定位到这个节点的前驱节点,所以它的平均复杂度是O(n

yang553566463的博客 1万+

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4455

Ubuntu中交叉编译armadillo库

网上关于交叉编译armdillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。交叉编译armdillo库包含两个步骤:交叉编译依赖库和交叉编译armdillo库。

weixin_39813867的博客 1879

双向链表为何时间复杂度为O(1)?

双向链表相比于单向链表,所谓的O(1)是指删除、插入操作。 单向链表要删除某一节点时,必须要先通过遍历的方式找到前驱节点(通过待删除节点序号或按值查找)。若仅仅知道待删除节点,是不能知道前驱节点的,故单链表的增删操作复杂度为O(n)。 双链表(双向链表)知道要删除某一节点p时,获取其前驱节点q的方式为 q = p->prior,不必再进行遍历。故...

weixin_30735745的博客 1万+

大模型训练和推理

大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。

weixin_45325331的博客 6021

链表,二叉树,堆,栈等的存、取数据的时间复杂度

链表,二叉树,堆,栈等的存,取数据的时间复杂度一、常用数据结构增删查时间复杂度1、数组1.1 正常数组:1.2 无下标数组:1.3 有序无下标数组:2、链表2.1 单向无序链表:2.2 单向有序链表:2.3 二叉排序树: 一、常用数据结构增删查时间复杂度 https://blog.youkuaiyun.com/MOMONGA/article/details/51578602 https://blog.csdn...

weixin_43199474的博客 3065

9、眼底图像智能分析:糖尿病视网膜病变的自动化识别与分级系统

本博客介绍了一种基于深度学习的糖尿病视网膜病变(DR)自动化识别与分级系统。该系统通过视网膜图像的预处理、数据增强、集成模型的构建与优化,实现了对DR的高效识别与分级。识别系统采用二分类任务,准确率达到97.67%,而分级系统通过四分类策略取得了95.2%的准确率。系统在基层社区和医院中具有广泛的应用前景,为DR的早期筛查和精准诊断提供了有效工具。

pea55的博客 144

拼多多小球直径轨迹重合验证码识别

本文分析了拼多多新型验证码的实现原理与破解思路。该验证码采用Canvas绘制小球弹跳轨迹验证,主要难点在于参数还原和轨迹计算。作者通过逆向工程提取了包括弹跳段数、振幅、旋转参数等关键配置(存储在config.json),并利用Python成功模拟了验证过程。核心算法将滑块值映射为0-1区间,通过三次变换计算小球位置,最终采用斜率截距最小值比对完成验证。整个过程分为静态初始化、核心计算和动态渲染三个阶段,其中干扰元素不影响核心验证逻辑。该研究仅用于技术学习,强调严禁任何违法行为。

码王吴彦祖的博客 1331

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

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

临时抱不到佛脚的博客 916

三极管、MOS管和晶体管综合对比——《器件手册--三极管、MOS管和晶体管》

IGBT(Insulated Gate Bipolar Transistor,绝缘栅双极型晶体管)是一种复合全控型电压驱动式功率半导体器件,结合了MOSFET的高输入阻抗、开关速度快的优点和双极型晶体管(BJT)的低导通压降、高电流密度的优点。例如,在NPN型三极管中,当基极电流增加时,集电极电流会按照一定的比例(放大倍数β)增加,这个比例通常在几十到几百之间。在NMOS管中,当栅极相对于源极的电压(Vgs)小于开启电压(Vth)时,漏极和源极之间没有导电沟道,电流无法通过,处于截止状态。

XU157303764的博客 2881

实现一个具备增删改查功能的双向链表

模仿LinkedList,实现一个具备基本的增、删、改、查功能的双向链表,旨在加深双向链表特点与应用的学习。

qq_39108894的博客 1187

深入详细分析Skyworks 78113 PAMiD射频方案图

是一种高集成度的射频前端模块,它结合了功率放大器(PA)、双工器(Duplexer)、滤波器和开关等多个组件,主要用于4G LTE移动通信系统中的射频前端链路。是一款典型的PAMiD模块,通过将多个频段的发射(TX)和接收(RX)路径集成在一个模块中,大大减少了传统射频设计中的分立器件,同时提高了信号链路的效率和可靠性。模块化设计的优势PCB空间优化:高集成度设计大幅减小了射频电路的尺寸,适用于紧凑型移动设备。减少设计复杂度:模块化设计减少了器件间的匹配与调试工作,加速产品开发周期。性能稳定性。

weixin_43199439的博客 1480

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

一篇讲完Java链表(单链表、循环链表和双向链表)

链表,是Java中的一种重要的链式数据结构。 众所周知,我们日常用手机电脑收发信息,下载视频和软件,都要进行数据的传输。这些数据都要以一种特定的数据结构来进行传输和存储,否则数据将会是一串毫无意义的0和1,无法生成我们想要的文件。一般来说有两种最常见的基本数据结构,一种是线性结构的数组,一种是链式结构的链表。

qq_42592994的博客 5817

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

链表LikedKist(单向链表、双向链表、单向循环链表)

二、链表(Linked List) 链表是以节点(node)存储的链式存储结构,一个node包含一个data域(存放数据)和一个next域(存放下一个node的指针),链表的各个节点不一定是连续的,它可以分为带头结点和不带头结点。头结点仅包含next域。 1、单向链表 1.1顺序插入 创建节点类,包含了data和next,next指向下一个节点对象 class PersonNode { pu...

Simon郎的博客 486

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【数据结构】带头双向循环链表的增删查改(C语言实现)

带头双向循环链表的实现以及链表、顺序表优缺点的总结。

在平淡的日子里寻找存在的价值 1697

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

链式存储中,所有节点的存储位置是随机的,他们之间的逻辑关系用指针来确定,跟物理存储位置无关,因此从上述示例代码可以很清楚看到,增删数据都非常迅速,不需要移动任何数据。首先,空链表有两种常见的形式。另外注意到,整条链表用一个所谓的头指针 head 来指向,由 head 开始可以找到链表中的任意一个节点。由于头结点是不存放有效数据的,因此如果空链表中带有头结点,那么头指针 head 将永远不变,这会给以后的链表操作带来些许便捷。上图中,所有的节点均保存一个指针,指向其逻辑上相邻的下一个节点(末尾节点指向空)。

qq_62917398的博客 957

数据结构 : 数组 / 链表 / 二叉排序树增删改查的时间复杂度解析

我们先看一下时间复杂度的概念:     在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。 记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述。 接下来我们对比一下数组 / 链表 / 二叉树增删改查的时间复杂度 一.数组 数组长...

鄙人kunzhi96,感恩遇见! 8665

用Java实现,数据结构-链表的增删改查

用Java实现,数据结构-链表的增删改查链表介绍链表单链表双向链表实现过程代码实现结果 链表介绍 链表 概述:是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。 特点:使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了...

BIackMamba的博客 720

C语言实现对顺序表和链表的增删改【数据结构/初阶】

顺序表和链表是数据结构中最基础的部分,我们将学习对它们的增删查改,这是也是许多OJ题的基础

Man9o 2358

【数据结构C/C++】双向链表的增删改查

对我个人而言,在开发过程中使用的比较多的就是双向链表了。很多重要的代码优化都会使用到基于双向链表实现的数据机构。比如我们常用的HashMap,我们知道Key其实是无序存放的,而LinkedHashMap底层使用HashMap+双向链表的方式实现了对key的有序遍历。双向链表的一些重要特点和优点:双向遍历:双向链表具有两个指针,一个指向前一个节点(前驱),一个指向后一个节点(后继)。这使得在链表中的任何位置都可以轻松地进行双向遍历,而不仅仅是单向遍历。

Zhangsama1的博客 668

C数据结构线性表:最全链表实战剖析—单 双 循环链表&增删改查

前言 说明1 文章首先是从单链表引入,由浅入深拓展到循环链表,但是循环链表我没有给代码,原因很简单,基本操作基本和单链表一样,就是判断条件从之前的是否为NULL变成了是否为头指针。比较着重性的给出单链表的具体如何操作与实现,循环链表的部分会提一下在单链表中如何修改成为循环链表。 说明2 双向链表具体实现其实也和单链表差不多,但是双向链表在连接节点的时候步骤比较多,我在文章和代码里面也总结了一下双向链表连接节点需要的“四步法。” 另一个循环双向链表我就不提了,因为看到这的小伙伴想必都对链表的功能实现已经烂熟于

本散修的一些学习心得与笔记,道友请自便。 1420

python实现链表(单向链表以及双向链表)

单向链表也是一种非常基本的数据结构,跟列表比较起来,它的内存不连续,在实际应用中场景还是多于列表的,列表之所以使用的场景多于链表无外乎以下几个原因: 1、列表是python内置的数据结构,可以直接使用;链表需要我们自己去设计 2、列表作为内置数据类型,为我们隐藏了实现细节,只是暴露了几个操作它的api(append、remove、pop、[start:stop]等),我们不用去关心底层实现,只关...

bruce_van的博客 2204

36张图带你深刻理解链表

欢迎来到算法小课堂,今天分享的内容是链表这种数据结构。在浅谈数组这篇文章中,我们说到数组在内存中是用一块连续的内存空间存储的。由于是用连续内存空间存储的,那么就会出现,明明还剩50M内存...

简一未 2119
上一篇: idea中修改变量名
下一篇: 环形单链表的增、删,查(约瑟夫问题)
大哥的叔
博客等级 码龄8年 72粉丝 295原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值