java 单向链表 双向链表_java 单向链表与双向链表的实现

链表

单向链表

单向链表概念

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

这是一种物理结构,不是树那样的逻辑结构。链表和顺序表两种物理结构,说明的是数据元素在内存中是如何存储的。顺序表是连续顺序存储,例如数组。而链表是非连续非顺序的。

基本API的java代码实现

代码如下,实现基本的增查删改的功能。public class SinglyLinkedList {

288eae6aca9cde9f5b7351abdace88ab.png

各个API的时间复杂度O(n)

接下来分析时间复杂度

Singly-Linked Listno tailwith tail

PushFront(key)

O(1)

TopFront()

O(1)

PopFront()

O(1)

PushBack(key)

O(n)

O(1)

TopBack()

O(n)

O(1)

PopBack()

O(n)

Find(key)

O(n)

Erase(key)

O(n)

Empty()

O(1)

AddBefore(Node,Key)

O(n)

AddAfter(Node,Key)

O(1)

很显然,每当我们的操作是从后往前进行时,复杂度就会很高。因为我们需要从头开始遍历.例如PopBack,我们需要从头开始遍历。像二分搜索,更是难以实现。如果有一个和next相对的previous指针,事情会简单很多。这就是双向链表的好处。

双向链表

双向链表概念

功能和单向链表一样,就是每次操作时要多对prev节点操作。每次插入和删除操作时,要处理四个节点的引用,而不是两个。

单向链表插入时,我们只需考虑改变插入节点的前一个节点的next(如果不是插入在头节点前),和插入节点的next。而双向链表插入时我们需要考虑插入节点的前一个节点的next,插入节点的prev和next,插入节点的后一个节点的prev((如果不是插入在尾节点后)。所以需要特别仔细。

基本API的代码实现

288eae6aca9cde9f5b7351abdace88ab.png

时间复杂度O(n)

Doubly-Linked Listno tailwith tail

PushFront(key)

O(1)

TopFront()

O(1)

PopFront()

O(1)

PushBack(key)

O(n)

O(1)

TopBack()

O(n)

O(1)

PopBack()

O(n) O(1)

Find(key)

O(n)

Erase(key)

O(n)

Empty()

O(1)

AddBefore(Node,Key)

O(n) O(1)

AddAfter(Node,Key)

O(1)

很明显,有了prev节点后,我们的PopBack和AddBefore时间复杂度都降低了,因为省去了遍历的过程。当然 ,由于多了两个链节点的引用,链节点占用的空间也会变大。所以使用双向链表就是用空间换时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值