模拟实现:

public class DoubleLinkedList {static class ListNode{int data;ListNode next;ListNode prev;public ListNode(int val){this.data=val;this.next=null;this.prev=null;}}public ListNode head;//标记头public ListNode last;//标记尾//遍历打印链表public void display(){ListNode cur=this.head;while(cur!=null){System.out.print(cur.data+" ");cur=cur.next;}System.out.println();}//尾插法public void addLast(int val){ListNode node=new ListNode(val);if(this.head==null) {this.head = node;this.last = node;}else{this.last.next=node;node.prev=this.last;this.last=node;}}//头插法public void addFirst(int val){ListNode node=new ListNode(val);if(this.head==null) {this.head = node;this.last = node;}else{node.next=this.head;this.head.prev=node;this.head=node;}}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int val){ListNode node=new ListNode(val);ListNode cur=this.head;int count=0;while(cur!=null){cur=cur.next;count++;}if(index<0||index>count){throw new RuntimeException("下标不合理");}if(index==0){addFirst(val);return;}if(index==count){addLast(val);return;}cur=this.head;for(int i=0;i<index;i++){cur=cur.next;}cur.prev.next=node;node.prev=cur.prev;node.next=cur;cur.prev=node;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){if(this.head==null){return false;}ListNode cur=this.head;while(cur!=null){if(cur.data==key){return true;}}return false;}//删除第一次出现关键字为key的节点public void remove(int key){ListNode newHead=new ListNode(-1);//设置一个虚头节点,就可以不用单独处理删除头节点的情况newHead.next=head;head.prev=newHead;ListNode cur=head;while(cur!=null){if(key==cur.data&&cur.next!=null){//当是中间结点时cur.prev.next=cur.next;cur.next.prev=cur.prev;head=newHead.next;break;}else if(key==cur.data&&cur.next==null){//当是尾结点时cur.prev.next=null;head=newHead.next;break;}cur=cur.next;}}//删除所有值为key的节点  之遍历链表一遍public void removeAll(int key){ListNode newHead=new ListNode(-1);//设置一个虚头节点,就可以不用单独处理删除头节点的情况newHead.next=head;head.prev=newHead;ListNode cur=head;while(cur!=null){if(key==cur.data&&cur.next!=null){//当是中间结点时cur.prev.next=cur.next;cur.next.prev=cur.prev;cur=cur.next;}else if(key==cur.data&&cur.next==null){//当是尾结点时cur.prev.next=null;cur=cur.next;}else{cur=cur.next;}}head=newHead.next;}//链表长度public int size(){ListNode cur=head;int len=0;while(cur!=null){len++;cur=cur.next;}return len;}//链表清空public void clear(){this.head=null;}
}

测试代码:

public class Test {public static void main(String[] args) {DoubleLinkedList linkedList = new DoubleLinkedList();linkedList.addLast(1);linkedList.addLast(1);linkedList.addLast(1);linkedList.addLast(2);linkedList.addLast(3);linkedList.addLast(4);linkedList.addLast(5);linkedList.display();linkedList.addIndex(0,10);linkedList.display();linkedList.addIndex(8,20);linkedList.display();linkedList.addIndex(4,30);linkedList.display();boolean flg=linkedList.contains(10);System.out.println(flg);linkedList.remove(10);linkedList.display();linkedList.remove(20);linkedList.display();linkedList.remove(30);linkedList.display();linkedList.removeAll(1);linkedList.display();int len=linkedList.size();System.out.println(len);linkedList.clear();}
}

运行结果:

【浅学Java数据结构】简单模拟实现双向链表相关推荐

  1. Java 代码简单模拟商城购物车

    纯Java代码模拟简单购物车功能 1.Product类 import java.util.Objects;public class Product implements Comparable{priv ...

  2. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”

    赋值运算符是双目运算符,用在赋值表达式中.赋值运算符将值存储在运算符左边操作数指定的变量中.有两种赋值操作,简单赋值和复合赋值,简单赋值把运算符右边的操作数的值存储在运算符左边操作数指定的变量中:复合 ...

  3. 使用java来简单模拟肯德基快餐店的收银系统实现一些功能

    一.题目要求 请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算和找零. 2.基本套餐结算 ...

  4. 初学JAVA之简单模拟拳皇

    1.设定双方角色的攻击力为5-15 模拟攻击力时则需要用到 随机数取值: Math.random( ) //初始取值范围为[0,1) 要将它的值确定到 5-15 则可用如下公式: (int)(Math ...

  5. 【浅学Java】网络编程

    网络编程 1. 网络编程基础 1.1 什么是网络编程 1.2 靠什么来进行网络编程 1.3 常见的Socket API 分类 1.4 初始UDP,TCP协议 1.5 什么是socket? 1.6 客户 ...

  6. 【浅刷Java数据结构】Leetcode 606 根据二叉树创建字符串

    链接: Leetcode 606 根据二叉树创建字符串 整体思路: 题目要求按照前序遍历的方式遍历.(根(左子树)(右子树)) 根为空直接返回. 根不为空时:看左右子树是否空,就可以分类讨论: 左树为 ...

  7. 银行业务队列简单模拟Java程序设计_PTA 数据结构 银行业务队列简单模拟

    仅供参考,请勿粘贴 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完 ...

  8. 图解Java数据结构之双向链表

    上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...

  9. 2021-2022学年度第二学期21级Java程序设计理论模拟考试

    说明:由于看pdf太难受了,重新编辑好放到博客上,方便自己复习,正确答案加粗标红 考试试卷 页码, 1/4 试卷名称:2021-2022学年度第二学期21级Java程序设计理论模拟考试(3.4.6班) ...

最新文章

  1. android Fragments详解五:与activity通讯
  2. 百度翻译十年:语种全球首破200大关,质量提升30个百分点,每天翻译超千亿字符...
  3. Growth Hacking背后,数据分析平台的架构调整
  4. AS编写sdk并打成jar包供其它APP调用
  5. 篇二:Eclipse安装配置Maven
  6. 程序员python工作_程序员如何在工作中进步
  7. 在IBM服务器安装Windows server 2012的心得
  8. [python] 在指定目录下找文件
  9. 2017 4月26日上午
  10. A 股历年三大财务报表 API 接口
  11. python打开setting_Python3 - setting的默认配置和用户配置读取
  12. JavaScript Date相关练习
  13. 计算机主板清理,电脑主板脏了如何清洗电脑主板才是正确
  14. 七参数坐标转换的几种解法
  15. JMeter录制不到接口(踩坑记录)
  16. 【华为OD机试模拟题】用 C++ 实现 - 英文输入法单词联想 or 英文输入法(2023.Q1)
  17. MATLAB中排序sort函数的用法
  18. 教师资格中学计算机知识点,2017年教师资格证《信息技术》高频考点
  19. VS2022快捷键修改 快速注释 行注释 ctrl +/
  20. 泛洪攻击以及防护方法

热门文章

  1. Vue抛 Property or method turn is not defined on the instance but referenced during render. 的解决方法
  2. Go 常用使用的包整理及介绍
  3. ubuntu虚拟机环境搭建
  4. win7 去掉系统快捷方式小箭头
  5. 2020年保研历程汇总(计算机科学与技术专业)
  6. WZSZF 整站源码,原来就是DISCUZ。
  7. 线性回归的一般形式、线性回归的特点、残差分析、Q-Q图、P-P图
  8. [转载][ZZ]计算机视觉研究群体及专家主页汇总_拔剑-浆糊的传说_新浪博客
  9. 未能连接重庆网上银行服务器,安装重庆银行“网上银行安全套件”后,键盘无法使用的解决方案...
  10. Android应用源码基于vitamio的网络电视直播源码