前言前面有很详细的讲过线性表(顺序表和链表) , 当时讲的链表以单链表为主,但在实际应用中双链表有很多应用场景,例如大家熟知的LinkedList 。
双链表与单链表区别单链表和双链表都是线性表的链式实现,它们的主要区别在于节点结构 。单链表的节点包含数据字段 data 和一个指向下一个节点的指针 next,而双链表的节点除了 data 和 next,还包含指向前一个节点的指针 pre 。这个区别会导致它们在操作上有些差异 。
单链表:单链表的一个节点,有储存数据的data,还有后驱节点next(指针) 。单链表想要遍历的操作都得从前节点—>后节点 。
文章插图
双链表:【一文搞定双链表,让你彻底弄懂线性表的链式实现】双链表的一个节点,有存储数据的data,也有后驱节点next(指针),这和单链表是一样的 , 但它还有一个前驱节点pre(指针) 。
文章插图
双链表结构的设计上一篇讲单链表的时候,当时设计一个带头结点的链表就错过了不带头结点操作方式,这里双链表就不带头结点设计实现 。所以本文构造的这个双链表是:不带头节点、带尾指针(tAIl)的双向链表 。
对于链表主体:
public class DoubleLinkedList<T> {private Node<T> head;private Node<T> tail;private int size;public DoubleLinkedList(){this.head = null;this.tail = null;size = 0;}public void addHead(T data){}public void add(T data, int index){}public void addTail(T data){}public void deleteHead(){}public void delete(int index){}public void deleteTail(int index){}public T get(int index){}public int getSize() {return size;}private static class Node<T> {T data;Node<T> pre;Node<T> next;public Node() {}public Node(T data) {this.data = https://www.isolves.com/it/sjk/bk/2023-11-08/data;}}}
具体操作分析对于一个链表主要的操作还是增删,查询的话不做详细解释 。剖析增删其实可以发现大概有头插入、编号插入、末尾插入、头删除、编号删除、尾删除几种情况 。然而这几种关于头尾操作的可能会遇到临界点比如链表为空时插入删除、或者删除节点链表为空 。
这个操作是不带头结点的操作,所以复杂性会高一些!
头插入
头插入区分头为空和头不为空两种情况 。头为空:这种情况head和tail都指向新节点 。
头不为空:
- 新节点的next指向head
- head的pre指向新节点
- head指向新节点(认新节点为head)
文章插图
尾插入
尾插需要考虑tail为null和不为null的情况 。流程和头插类似,需要考虑tail指针最后的指向 。tail为null:此时head也为null,head和tail指向新节点 。
tail不为null:
- 新节点的pre指向tail
- tail的next指向新节点
- tail指向新节点
按编号插入分情况讨论,如果是头插或者尾插就直接调用对应的方法 。普通方法的实现方式比较灵活 , 可以找到前驱节点和后驱节点,然后进行指针插入,但是往往很多时候只用一个节点完成表示和相关操作,就非常考验对表示的理解 , 这里假设只找到preNode节点 。index为0:调用头插 。index为size:调用尾插
index在(0,size):
- 找到前驱节点preNode 。
- 新节点next指向nextNode(此时用preNode.next表示) 。
- nextNode(此时新节点.next和preNode.next都可表示)的pre指向新节点 。
- preNode的next指向新节点 。
- 新节点的pre指向preNode 。
文章插图
头删除
头删除需要注意的就是删除不为空时候头删除只和head节点有关head不为null:
- head = head.next 表示头指针指向下一个节点
- head 如果不为null(有可能就一个节点),head.pre = null 断掉与前一个节点联系 ;head如果为null,说明之前就一个节点head和pre都指向第一个节点,此时需要设置tail为null 。
推荐阅读
- 一文带你了解Spring Actuator
- 一文读懂Android架构演进历程
- 太阳具有5个特点,除此之外《太阳》一文还介绍孑太阳和的特点
- 一文搞明白Hive与数据库区别
- 公认好用的5款“眼霜”:保湿滋润、淡化细纹都能搞定,建议收藏
- 一文带你彻底了解JMX
- 怎么把图片转换成pdf格式?教你3种方法,轻松搞定
- K8s部署方式大全:从基础到进阶,一文带你掌握所有技巧
- 家用血糖仪应该怎么用?一文读懂这些细节→
- 容易忽视的7个减肥误区,搞定它们,轻松瘦出“小蛮腰”