双向链表总体来说和单链表差别不大,最大的区别就是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. 后台管理系统带关闭的选项卡(多标签页)功能 适配bootstrap3和4 Bootstrap Hover Dropdown

    眼看着是不是很熟悉,其实基本大部门后台管理系统都有这个功能,使用iframe实现展示标签页面. 主要功能:标签页点击,添加标签页,向左滚动标签页,向右滚动标签页,刷新当前标签页,关闭当前标签页,关闭其 ...

  2. 你好 ChatGPT, 帮我看下这段代码有什么问题?

    点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多系列文章. 今天一个很简单的功能,触发了一个 BUG,处 ...

  3. P24_wxss - wxss与css的关系

    WXSS 模板样式 什么是 WXSS WXSS (WeiXin Style Sheets)是一套样式语言,用于美化 WXML 的组件样式,类似于网页开发中的 CSS. WXSS 和 CSS 的关系 W ...

  4. ros_navigation案列操作流程

    1. 启动仿真 source devel/setup.bash export TURTLEBOT3_MODEL=burger roslaunch turtlebot3_gazebo turtlebot ...

  5. ubuntu18.04编译webrtc_android库

    webrtc 是谷歌提供的音视频通讯方案, 能够很好的解决音视频互联互通的场景. 本文基于 Ubuntu 18.04 编译 android 版本的过程, 其它平台也可以参考, 基本都大同小异. 编译环 ...

  6. 解决VS2019 DevExpress工具不显示问题

    一.序言 环境:NetFramework4.5,vs2019社区板 ,DevExpress 14.2.3 项目类型:winfrom 二.解决 找到DevExpress安装路径下的Bin\Framewo ...

  7. 一段简单的对TXT文件的操作代码

    1 string txt = @"C:\DetectFolder\IPV4地址.txt"; 2 string path = ""; 3 4 if (File.E ...

  8. 关于HTML5中Video标签播放问题

    PS:官网首页视频IOS与安卓都可播放代码: <video width="100%" height="auto" type="video/mp4 ...

  9. CF863E - Turn Off The TV

    题意:对于若干个闭区间 \([l_i,r_i]\),它们构成了一个集合 \(\bigcup_{i\le n}{[l_i,r_i]}\),求一个 \(k\),使得 \(\bigcup_{i\le n}{ ...

  10. wsl安装和使用

    1.安装wsl的版本 1.使用管理员身份打开powershell,执行 wsl --list --online 2.安装相应的版本 wsl --install -d Ubuntu-20.04 2.更改 ...