public class DoubleLinkedListZH<E> {//调用方法参数是index的记得检测是否在合法范围(0~size-1)内,可以写一个arrangeCheck函数,我懒了,默认输入合法//双向链表,一个结点前后两个指针//双向链表相比单链表,add方法和remove方法大改,分四到三种情况,比较重要,时刻注意空指针报错//clear方法的实际意义涉及到java 的内存管理机制,也可以好好回顾//tostring也改了一下,sout(node)本质是调用node的toString函数,重写toString函数真的很实用,StringBuilder的用法也需要掌握public static final  int ELEMENT_NOT_FOUND = -1;private int size;//定义全局变量(不在函数里的)不初始化默认初始值为0,局部变量则初始值随机private DoubleLinkedListZH.Node<E> headNode;private DoubleLinkedListZH.Node<E> lastNode;private static class Node<E> {E element;DoubleLinkedListZH.Node<E> next = null;DoubleLinkedListZH.Node<E> prev = null;//JAVA把指针淡化了,C中需要Node *p = next;next -> nextNode;,Java中只要next=nextNode就可以了public Node(DoubleLinkedListZH.Node<E> prev ,E element, DoubleLinkedListZH.Node<E> next) {this.element = element;this.prev = prev;this.next = next;}public Node() {}@Override//重写了toString函数,输出:null<-0->1 一个结点及其前后指针和对应结点public String toString() {StringBuilder sb = new StringBuilder();if (prev!=null){sb.append(prev.element);}else{sb.append("null");}sb.append("<-").append(element).append("->");if (next!=null){sb.append(next.element);}else{sb.append("null");}return sb.toString() ;}}//非gc boot对象,即没有被栈指针或栈指针间接指向的对象,就被自动回收了public void clear(){headNode = null;lastNode = null;size = 0;}public void isEmptyPrint(){if (headNode == null){System.out.println("Empty");}else{System.out.println("Not Empty");}}//是否包含,一定记得看看有没有多余句子写到循环里了public void containsPrint(E element){DoubleLinkedListZH.Node<E> node = headNode;for(int i = 0;i < size ; i++){if (node.element == element){System.out.println("Contain");return;}node = node.next;}System.out.println("Not Contain");}//双向链表add,实际上有四种情况,分别是链表全空时插入,链表非空在头结点前插入,链表非空在尾结点后插入,链表非空在非头尾结点插入//时刻注意空指针错误!!!尤其链表题public void add(int index , E element){DoubleLinkedListZH.Node<E> node = new Node<>();node.element = element;if (size == 0){headNode = node;lastNode = node;}else if (index == 0){node.next = headNode;headNode.prev = node;headNode = node;node.prev = null;}else if (index == size){node.prev = lastNode;lastNode.next = node;lastNode = node;node.next = null;}else {DoubleLinkedListZH.Node cur = indexSearchNode(index);node.next = cur;node.prev = cur.prev;cur.prev.next = node;cur.prev = node;}size++;}public void remove(int index){DoubleLinkedListZH.Node<E> node = indexSearchNode(index);if(node.prev == null){headNode = node.next;node.next.prev = null;}if (node.next == null){node.prev.next = null;lastNode = node.prev;}else {node.prev.next = node.next;node.next.prev = node.prev;}size--;}public void add(E element){add(size,element);}//根据索引返回对应结点,注意返回值是Node<E>而不是E,该函数经常在别的函数内使用//注意这里是双向链表的优势之一,按index查找结点的平均时间要少,因为可以从两边往中间找,最坏就是在中间private DoubleLinkedListZH.Node<E> indexSearchNode (int index){DoubleLinkedListZH.Node node = new Node();if(index <= size / 2){node = headNode;for (int i = 0; i<index; i++){node = node.next;}}else{node = lastNode;for (int i = size - 1; i > index ; i--){node =node.prev;}}return node;}public String toString() {StringBuilder string = new StringBuilder();string.append("size=").append(size).append("  [");DoubleLinkedListZH.Node<E> node = headNode;for (int i = 0; i < size; i++) {if (i != 0) {string.append(", ");}string.append(node);node = node.next;}string.append("]");return string.toString();}}

2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)相关推荐

  1. 2021-9-下旬 数据结构-线性表-队列-java代码实现(复习用)

    话说...每次都用现成的类实现,是不是有点偷懒 //队列的本质也是线性表,特性为只在线性表首位端进行操作,为先进先出,和生活中排队的队列是一样的 //队列涉及到的操作主要是入队(enQueue)和出队 ...

  2. 2021-9-下旬 数据结构-线性表- 栈 -java代码实现(复习用)

    import java.util.ArrayList; import java.util.List; //栈的本质就是线性表,因为总在线性表的表尾端进行操作(出栈入栈),其重要特性为FILO先进后出 ...

  3. 2021-9-下旬 数据结构-线性表-链表-java代码实现(复习用)

    链表涉及到指针了,这里我还不了解java里对指针的隐藏,又由于以前学过C++里的指针,二者混淆,导致一开始非常蒙,出了很多问题,当然后来随着边写边查,基本都解决了. 顺便学习了一下java里的泛型 / ...

  4. 2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现

    //循环双端队列:Circle Double Ended Queue //本质是对动态数组的优化 //队头队尾都可以添加或删除元素 //相比于普通循环队列需要注意的点是在队头插入元素时的对front前 ...

  5. 2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码

    //循环队列,本质就是用动态数组实现的,且出队入队时间复杂度均O(1)的队列 //相比普通队列,增设一个front指针,代表队头,代表下一个出队的元素 //循环队列的重点在于队头队尾的元素的下标的计算 ...

  6. 2021-9-下旬 数据结构 - 线性表 - 循环链表 - java实现代码(复习用)

    public class CycleLinkedListZH<E> {public static final int ELEMENT_NOT_FOUND = -1;private int ...

  7. 线性链表java实现_线性表的Java实现--链式存储(双向链表)

    线性表的Java实现--链式存储(双向链表) 有了单向链表的基础,双向链表的实现就容易多了. ? 双向链表的一般情况: ? ? class="decoded" alt=" ...

  8. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

  9. 数据结构-线性表-思维导图+小结

    数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...

最新文章

  1. PARAMETERS 指令
  2. 你能找到心仪的妹子吗?- 时间复杂度进阶
  3. 一篇blog带你了解java中的锁
  4. drupal与html转换,老葛 怎么改变drupal form 生成的html啊 ? | Think in Drupal
  5. php中(foreach)用法介绍
  6. 百度网页移动端html,百度移动端开始用网站品牌名代替网址显示
  7. ListViewAdapter
  8. Understanding ASP.NET Validation Techniques
  9. 光电编码器的原理及应用场合_光电编码器的原理及应用电路
  10. C语言找素数的几种方法
  11. 印象笔记:解决Chrome插件安装时程序包无效:CRX_HEADER_INVALID
  12. 计算机网络 故障处理,浅析计算机网络常见故障处理及维护方法
  13. 大数据的兴起,数据科学家的崛起
  14. 用python如何制作表格_Python中如何用xlwt制作表格
  15. 京东商品图片 自动下载 抓取 c# 爬虫
  16. 安卓Android、iOS移动端车牌识别OCR技术原理
  17. 清华计算机408考研真题资料经验分享
  18. C++17值类型 (Value Categories)
  19. MySQL卸载干净的全过程
  20. Element-UI组件之其他Others

热门文章

  1. 测验2: Python基本图形绘制 (第2周)
  2. jacoco入门_代码覆盖度工具jacoco的入门
  3. 树莓派搭建TensorFlow
  4. 跨链Cosmos(12) Cosmos插件
  5. Qt 原理-MOC(2) QObject.h
  6. 初等数论--原根--原根间的关系,原根个数
  7. 攻防世界Reverse第二题insanity
  8. 【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)
  9. [crypto]-01-对称加解密AES原理概念详解
  10. Django简介Django 各个环境下的安装