双向链表总体来说和单链表差别不大,最大的区别就是node结构中多了一个pre指针(变量)指向前一个节点,因为有了之前的单链表基础,双向链表的复现问题少了很多,基本可以不参考老师的代码自主写下来。

1、添加函数(加入到链表最后)

因为此处的添加只需加到最后即可,按照单链表的添加,遍历到最后并更改辅助节点的next指向node和node的pre指向temp即可。

public void add(teamNode1 node){
teamNode1 temp=head;
while(true){
if(temp.next==null) break;
temp=temp.next;
}
temp.next=node;
node.pre=temp;
}

2、显示函数(打印出链表内的所有节点)

今天测试的时候发现昨天好像写错了- -,今天发现最后一个节点的信息无法被打印。后来发现,判断next为null的语句不同于其他函数,此处应该放在输出语句之后,后移语句之前。

public void list(){
if(head.next==null){
System.out.println("链表为空");
return;
}
teamNode1 temp=head.next;
while (true){
System.out.println(temp);
if(temp.next==null) break;
temp=temp.next;
}
}

3、更新函数 与单链表的修改函数完全一致

public void update(teamNode1 node){
teamNode1 temp=head;
boolean flag=false;
while (true){
if(temp.next==null) break;
if(temp.no==node.no){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
temp.name=node.name;
temp.point=node.point;
}else {
System.out.println("未找到要修改的队伍");
}
}

4、删除函数

此处与单链表有较大不同,双向链表可实现自我删除,遍历到要删除的节点即可,而非要删的节点的前一个节点。但有个要注意的就是当要删除的函数为链表最后一个函数时,temp的next节点l为空,没有pre指针,也无法将pre指向node,所以在修改前要先判断。

public void delete(int n){
if(head.next==null) {
System.out.println("链表为空无法删除");
return ;
}
boolean flag=false;
teamNode1 temp=head;
while(true){
if(temp.next==null) break;
if(temp.no==n){
flag=true;
break;
}
temp=temp.next;
}
if(flag&&temp.next!=null){
temp.pre.next=temp.next;
temp.next.pre=temp.pre;
}else if(flag){
temp.pre.next=temp.next;
}else {
System.out.println("未找到该位置队伍,无法删除");
}
}

5、按顺序加入函数 双向链表addbyorder

思路和单链表的按顺序插入相似,此处的加入到中间,需要先用temp.next.no> node.no找到应该插入的位置与插入位置前一个节点的temp,然后从后往前更改,先更改temp的next节点即要插入位置的后一个节点名为last,将它的pre指向node。然后更改node的next指向last,更改node的pre指向temp,最后更改temp的next指向node。这是比较顺的思路,不会导致有用的信息被覆盖掉。

另外的,与删除链表相对应,此处要多考虑一种加入时要加入到链表尾部时的情况,相对于上面的情况,就不存在last这个节点了,因此不用修改node的next和last的pre。

因为情况比较多,我放弃了布尔值的标识符,用int的标识符,赋予123值来区分情况,1为需要插入,即前后都有节点,2为链表中已有该编号队伍,0为遍历到最后发现没有编号大于他的节点,也没有等于它的节点,所以就是要加在结尾。

public void addbyorder(teamNode1 node){
teamNode1 temp=head;
int flag=0;
while (true){
if (temp.next==null) break;
if(temp.next.no== node.no){
flag=2;
break;
}
if (temp.next.no> node.no){
flag=1;
break;
}
temp=temp.next;
}
if(flag==1){
temp.next.pre=node;
node.next=temp.next;
node.pre=temp;
temp.next=node;
}else if(flag==0){
temp.next=node;
node.pre=temp;
}else {
System.out.println("已有该队伍");
}
}

10,java双向链表基础代码复现的更多相关文章

  1. Java常用基础代码

    1.加载properties文件 Properties properties = new Properties();  properties.load(Properties.class.getReso ...

  2. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...

  3. 【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数

    为什么要进行Java常识性基础补充? 之前学习Java语言,学得很多很杂,而且是很多不同的方面插入讲解的,比如在跟班上课,自学java编程例子,java语法,过了很久,因为各种原因长时间不怎么写,有时 ...

  4. java:Spring框架1(基本配置,简单基础代码模拟实现,spring注入(DI))

    1.基本配置: 步骤一:新建项目并添加spring依赖的jar文件和commons-logging.xx.jar: 步骤二:编写实体类,DAO及其实现类,Service及其实现类; 步骤三:在src下 ...

  5. java:struts2.3框架1(struts2快速配置,各文件之间的关系,基础代码简化版,XML中的通配符)

    1.struts2快速配置: A.到http://struts.apache.org下载struts2开发包struts-2.3.32-all.zip B.新建web项目并添加struts2依赖的ja ...

  6. [Java基础]代码块及java反编译

    块的作用域:   块(即复合语句)是指一对花括号括起来的若干条简单的java语句.块确定了变量的作用域.一个块可以嵌套在另一个块中.但是,在嵌套的两个块中声明同名的变量时应注意,块中变量申明在块外变量 ...

  7. JAVA面试基础

    JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...

  8. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  9. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  10. java必备基础知识点

    Java基础 1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出 ...

随机推荐

  1. Selenium CHANGELOG[最新版本4.8.0 计划中]

    Selenium CHANGELOG[持续更新] 源文件 https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES 搬运工 对重点版本做 ...

  2. Rust Rand生成随机数

    # in project file cargo add rand extern crate rand; use rand::Rng; fn main() { let mut rng = rand::t ...

  3. STM32F4寄存器初始化:编码器

    RCC->APB1ENR|=1<<0; //TIM2时钟使能 RCC->APB1ENR|=1<<1; //TIM3时钟使能 RCC->APB1ENR|=1&l ...

  4. 软赢软件控制器在Zstack云主机实现电机控制的方法

    工控领域上云实践-Zstack和软赢 在上面链接提到软赢的软件运动控制器在Zstack云主机上实现etherCat总线的电机控制,在后来的对比中发现,在云主机上虽然实现了让电机转起来,但是因为实时性还 ...

  5. k8s中使用prometheus operator监控外部服务器部署的windows exporter

    k8s中使用prometheus operator监控外部服务器部署的windows exporter 0.文档说明 (1)Prometheus Operator是一个流行的k8s集群监控套件,项目地 ...

  6. TCP/IP 协议(10):TCP 协议一百问

    TCP/IP 协议(10):TCP 协议一百问 杨领well 的 TCP/IP 协议专栏 TCP 协议部分一直没有更新,是因为我不确定到底应该怎么来介绍 TCP 协议才能干货满满.最后我决定以 Q&a ...

  7. JZOJ 5343. 【NOIP2017模拟9.3A组】健美猫

    题面 其中 \(1 \leq n \leq 2 \times 10^6\) 分析 考虑每次移动,发现负数对答案贡献少 \(1\),非负数多 \(1\) 每次移动都加了 \(1\) 负数变非负数关键点在 ...

  8. js获取时间戳的方法

    js获取时间戳的方法 转载脚本之家: https://www.jb51.net/article/77066.htm 转载博客园八英里: https://www.cnblogs.com/deepalle ...

  9. Nacos集群搭建(三个节点)

    Nacos集群安装 一,在每台服务器上安装nacos 1,准备安装包 ​ github下载点 2,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ # ...

  10. 转码服务serverless探索

    背景 公司目前主要聚焦于视频这个领域,利用视频为媒体.文旅.会议等行业进行赋能. 既然聚焦于视频领域,那么视频转码则是绕不开的话题. 为了降低成本,以及保证产品的核心能力,公司自建了一套转码系统. 转 ...