文章目录
- 直奔主题:单向链表 和 双向链表 的 数据结构(下面是不带头的)
-
- 节点删除,双向链表不需要借助前驱节点
-
- 先来看单向链表是怎么来删除节点的
- 废话不多说,实战中学习
-
- 模拟实现双向链表(不带头)
-
- 对双向列表的节点,进行抽象 ,写出一个类
- 而对于 双向链表抽象出的类,它必须具有两个属性 head(头节点) 和 last(尾结点)
- 因为 我们已经有了单链表的基础,所以一些简单功能我就直接放上来
-
- display 打印val值 功能
- contains 功能 - 确认是包含指定val数据
- size - 得到双向链表的长度
- remove 删除 指定key值的节点(这里应该是布尔类型,但是我为了方便 就 void 的了,影响不大)
- removeAll -删除所有值为key的节点 就是 把 remove 中 那个 if 包裹的 return 删掉 就可以了
- clear - 清空 链表节点
- 直至双向链表的所有功能就都实现了,随后附上整体程序(附赠带头的双向链表)
博主突然记起来了!好像还漏一个双向链表没有写博客,今天就给大家补上。
建议先看 这篇文章 顺序表 和 链表 - 单向链表部分 ,再来看这篇双向,本篇文章可能相对粗略,所以建议你们先看单向链表的文章,有助于你们理解,
直奔主题:单向链表 和 双向链表 的 数据结构(下面是不带头的)
双向链表 和 单向链表的区别,就在于 双向 比 单向 多个 一个前驱地址。而且 你会发现 正因为有了前驱地址,所以所以这个链表,它有两种走向,这也是这个链表为什么叫做双向链表的原因之一。
双向链表的好处
节点删除,双向链表不需要借助前驱节点
先来看单向链表是怎么来删除节点的
总结:
单向链表在删除一个节点的时候,需要借助前驱节点,才能删除。
再来看双向的
废话不多说,实战中学习
模拟实现双向链表(不带头)
对双向列表的节点,进行抽象 ,写出一个类
而对于 双向链表抽象出的类,它必须具有两个属性 head(头节点) 和 last(尾结点)
因为 我们已经有了单链表的基础,所以一些简单功能我就直接放上来
display 打印val值 功能
public void display() { //和单链表的打印方式是一样 ListNode cur = this.head; while (cur != null) { System.out.print(cur.val +" "); cur = cur.next; } System.out.println(); }
contains 功能 - 确认是包含指定val数据
public boolean contains(int key) { ListNode cur = this.head; while (cur != null) { if (cur.val == key) { return true; } cur = cur.next; } return false; }
size - 得到双向链表的长度
public int size() { int count = 0; ListNode cur = this.head; while (cur != null) { count++; cur = cur.next; } return count; }
public void addFirst(int data) { ListNode node = new ListNode(data); if (this.head == null) { this.head = node; this.last = node; } else { node.next = this.head; this.head.prev = node; this.head = node; } }