10,java双向链表基础代码复现
双向链表总体来说和单链表差别不大,最大的区别就是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双向链表基础代码复现的更多相关文章
- Java常用基础代码
1.加载properties文件 Properties properties = new Properties(); properties.load(Properties.class.getReso ...
- 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例
Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...
- 【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数
为什么要进行Java常识性基础补充? 之前学习Java语言,学得很多很杂,而且是很多不同的方面插入讲解的,比如在跟班上课,自学java编程例子,java语法,过了很久,因为各种原因长时间不怎么写,有时 ...
- java:Spring框架1(基本配置,简单基础代码模拟实现,spring注入(DI))
1.基本配置: 步骤一:新建项目并添加spring依赖的jar文件和commons-logging.xx.jar: 步骤二:编写实体类,DAO及其实现类,Service及其实现类; 步骤三:在src下 ...
- java:struts2.3框架1(struts2快速配置,各文件之间的关系,基础代码简化版,XML中的通配符)
1.struts2快速配置: A.到http://struts.apache.org下载struts2开发包struts-2.3.32-all.zip B.新建web项目并添加struts2依赖的ja ...
- [Java基础]代码块及java反编译
块的作用域: 块(即复合语句)是指一对花括号括起来的若干条简单的java语句.块确定了变量的作用域.一个块可以嵌套在另一个块中.但是,在嵌套的两个块中声明同名的变量时应注意,块中变量申明在块外变量 ...
- JAVA面试基础
JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- JAVA相关基础知识
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...
- java必备基础知识点
Java基础 1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出 ...
随机推荐
- SpringBoot+mybatis的驼峰命名转换不生效
使用SpringBoote+mybatis在mybatis-config.xml的配置文件内配置的驼峰命名不生效 然后我就将mybatis的配置写在application.yml内,然后就生效了 用注 ...
- Visual Studio 集成了.NET 升级助手插件
.NET团队2023年2月16日在官方博客上发布了名为".NET Upgrade Assistant"的全新 Visual Studio 扩展,帮助开发人员升级.NET 应用程序. ...
- 【python自动化测试】1- python基础和pycharm使用
python基础和pycharm使用 1.pycharm 1.1 为特定格式文件添加头信息 File--Settings--Editor--File and Code Templates--Pytho ...
- 分布式共识算法随笔 —— 从 Quorum 到 Paxos
分布式共识算法随笔 -- 从 Quorum 到 Paxos 本文主要参考各类英文文献,部分专业术语翻译较为生硬,望谅解. 概览: 为什么需要共识算法? 昨夜西风凋碧树,独上高楼,望尽天涯路 复制(Re ...
- JZOJ 3213. 【SDOI2013】直径
题目 思路 树的直径很好求,两遍 \(dfs\),记下两个端点 然后很显然所有直径经过的边必然在我们求出的这条直线上 那么我们只要判断一下一条直径上的边是不是答案 假设当前边为 \(i\) 那么把 \ ...
- 免杀之:Python加载shellcode免杀
免杀之:Python加载shellcode免杀 目录 免杀之:Python加载shellcode免杀 1 Python 加载Shellcode免杀 使用Python可以做一些加密.混淆,但使用Pyth ...
- 基于Python的OpenGL 04 之变换
1. 概述 本文基于Python语言,描述OpenGL的变换 前置知识可参考: 基于Python的OpenGL 03 之纹理 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里 ...
- c++多线程thread用法小例子
测试分布式存储系统时,针对并发测试,同时创建500个文件,采用这种方法. #include<iostream> #include<thread> using namespace ...
- mybatis动态标签——where、if
mapper接口 public interface EmpMapper { List<Emp> getEmp(Emp emp); } mapper.xml <?xml version ...
- Appium常见属性和命令
from appium import webdriverimport time, tracebackdesired_caps = {}desired_caps['platformName'] = 'A ...