Java实现双向链表

  • 一、链表的概念及结构
  • 二、头指针与头结点的异同
  • 三、代码实现

一、链表的概念及结构

我们在单链表中,有了next指针。这就使得我们查找下一个结点的时间复杂度为O(1)。可是我们要查找的是上一个结点的话,那最坏的时间复杂度就是O(n)了,因为我们每次都要从头遍历查找。

为了克服单向性这一缺点,我们就提出了双向链表。双向链表(double linked list)是在单链表的每个结点中,在设置一个指向其前驱结点的指针域。 所以双向链表的结构都有两个指针域,一个指向直接后继,另一个指向直接前驱。

二、头指针与头结点的异同

  • 头指针
    1.头指针是指链表指向第一个结点的指针,若链表有头节点,则是指向头节点的指针。
    2.头指针是具有标识作用,所以常用头指针冠以链表的命名
    3.无论链表是否为空,头指针均不为空。头指针是链表的必要元素
    若头指针为空,则链表不存在。

  • 头结点
    1.头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度)
    2.有了头结点,对在第一元素结点前插入结点和删除第一节点,其操作与其他结点的操作就统一了
    3.头节点不一定是链表的必须元素

三、代码实现

public class LinkedList {//一般脱离类无实际意义,所以定义为静态类static class Node {int val;Node prev;Node next;public Node(){}public Node (int val) {this.val = val;}}//定义头结点和尾结点Node head;Node last;//头插法public void addFirst(int val){Node node = new Node(val);if (head == null) {head = node;last = node;return ;}node.next = head;head.prev = node;head = node;}//尾插法public void addLast(int val){Node node = new Node(val);if (head == null) {head = node;last = node;return ;}last.next = node;node.prev = last;last = node;}//任意位置插入,第一个数据节点为0号下标public boolean addIndex(int index,int val){if (head == null) {return false;}//判断所给的索引合法性if (index < 0 || index > size()) {throw new RuntimeException("the index is not illegal!");}//第一个位置插入的时候,此时就是头插法if (index == 0) {addFirst(val);return true;}//最后一个位置插入则为尾插法if (index == size()) {addLast(val);return true;}//最后考虑中间位置的插入即可//1.定义临时头结点,先走到待插入位置的前一个位置Node temp = head;while (index > 1) {temp = temp.next;index--;}//2.对元素进行插入Node node = new Node(val);node.next = temp.next;node.prev = temp;temp.next.prev = node;temp.next = node;return true;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){if (head == null) {return false;}//只要在链表找到我们就返回false就行Node temp = head;while (temp != null) {if (temp.val == key) {return true;}temp = temp.next;}return false;}//删除第一次出现关键字为key的节点public void remove(int key){if (head == null) {return ;}//只要存在我们才可以去删除if (!contains(key)) {throw new RuntimeException("the key is not exist !");}//如果是头节点的情况就直接删除if (head.val == key) {head  = head.next;head.prev = null;return ;}//1.找到第一次出现的关键字key的前一个位置Node temp = head;while (temp != null) {if (temp.val == key) {temp.prev.next = temp.next;temp.next.prev = temp.prev;return;}temp = temp.next;}}//删除所有值为key的节点public void removeAllKey(int key){if (head == null) {return ;}while (contains(key)) {remove(key);}}//得到单链表的长度public int size(){if(head == null) {return 0;}Node temp = head;int size = 0;while (temp != null) {size++;temp = temp.next;}return size;}//遍历双向链表public void display(){if (head == null) {return ;}Node temp = head;while (temp != null) {System.out.print(temp.val + " ");temp = temp.next;}}//清空链表public void clear(){head = null;last = null;}
}

【数据结构】—— Java实现双向链表相关推荐

  1. 数据结构JAVA实现——树

    数据结构JAVA实现--树 数据结构java实现--树的双亲表示法 数据结构Java实现--树|N叉树之孩子双亲表示法--顺序存储结构+链表 无序二叉树的实现 前序线索二叉树,中序线索二叉树 后续线索 ...

  2. Java数据结构第五版期末考试_数据结构(java)期末复习

    [单选题]多基因遗传病的发病风险与下列哪个因素无关 [单选题]一般手锯的往复长度不应小于锯条长度的( ). [判断题]机器上所有;零件都必须进行机械加工. [单选题]一般划线精度能达到( ). [填空 ...

  3. 数据结构之——《双向链表》

    数据结构之--<双向链表> 1.双向链表 2.特点 3.接口实现 1.双向链表 带头双向循环链表,实现插入,删除特别容易,而且时间复杂度为o(1). 2.特点 (1)优点:任意位置插入,删 ...

  4. 数据结构java版本

    文章目录 数据结构java版本 1.Array 2. Stack 3. Queue 4. LinkedList 5. Tree 5.1 树 Tree 5.1.1 二分搜索树 Balanced Bina ...

  5. Go数据结构与算法-双向链表

    title: Go数据结构与算法-双向链表 tags: go,算法 介绍 和单链表比较,双向链表的元素不但知道自己下一个节点,还知道自己的上一个节点. 向后面车厢的箭头,车尾只有指向前面车厢的箭头. ...

  6. 冒泡排序算法(思路分析) [数据结构][Java]

    冒泡排序算法(思路分析) 基本介绍: 冒泡排序(Bubble Sorting)的基本思想是: 通过对 "待排序序列" 从前向后一次比较相邻元素的值,若发现逆序则交换,使值较大的元素 ...

  7. java实现双向链表的增删改

    双向链表:java实现双向链表的增删改,供大家参考,具体内容如下 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除 ...

  8. 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...

  9. 希尔排序算法(思路分析) [数据结构][Java]

    希尔排序算法(思路分析) 希尔排序也称之为: 缩小增量排序 希尔排序提出的背景: 因为简单插入排序中存在一些问题( 这里我们以升序排序为例 ): 当我们要待插入的数值比较小时后移的次数明显增多,对效率 ...

最新文章

  1. ASP.NET Aries 高级开发教程:Excel导入配置之规则说明(下)
  2. 公司的API接口被刷了,那是因为你没这样做
  3. 一文详解激光雷达感知方案
  4. Gartner:企业架构开始更加紧密地向业务看齐
  5. Photoshop CS6软件安装教程
  6. quality center 支持的平台
  7. windbg断点学习总结
  8. window10电脑远程没有oracle,win10 不安装oracle plsql连接远程oracle
  9. 动态网站的技术路线_3个好玩实用小网站!闲暇时间不妨打开看看
  10. js+面向对象相关笔记(六)
  11. eclipse中maven工程添加本地库至Maven Dependencies
  12. maven本地仓库中存在jar包,但编译不成功,显示jar包不存在
  13. BITED数学建模七日谈之一:参加全国大学生数学建模比赛前你需要积累哪些
  14. prometheus grafana 统计cpu个数
  15. PTA-C语言-解一元二次方程
  16. java爬虫系列(三)——漫画网站爬取实战
  17. 毕业设计-基于协同过滤算法的旅游推荐系统
  18. 小滴课堂工业级paas云平台+springcloudAlibaba+JDK11综合项目实战
  19. lingo中@wrap函数的理解
  20. “双重主要上市”潮流来袭,中通快递“赶时髦”意欲何为?

热门文章

  1. 用php代码输出成绩的最高分,中学成绩分析-提取每科最高分学生名单
  2. 自定义kindeditor编辑器的工具栏,items即去除不必要的工具栏或者保留部分工具栏
  3. 将百分制成绩转换为 5 分制成绩
  4. View绘制之ScrollBar绘制
  5. 如何复活古人?#MetaHuman 让万年前的骨架重获肉身
  6. bottleneck resnet网络_关于ResNet网络的一点理解(网络结构、building block 及 “bottleneck” building block)...
  7. unity中利用cinemachine插件制作玩家视觉效果(第三人称转第一人称视角)
  8. 东财《劳动法X》综合作业
  9. 2021上海高考小三门成绩查询,数据分析:上海高考小三门选考攻略
  10. 按一个按钮会随机死人_玩家集体吐槽支机石:坑死人不偿命的概率