链表——双端链表:
双端链表和单向列表时相似的,但是在单向列表的基础上增加了一个特性,就是增加了对最后一个
链接点的引用,就像对第一个链接点的引用一样。但我们试图寻找最后一个链接点的时候就不用像
单向链表需要遍历所有的链接点了,可以直接通过最后一个链接的位置获取数据,并且可以在链表的
尾端添加节点。
//双端列表
class FirstLastList{
public static void main(String[] args) {
FirstLastList f = new FirstLastList();
f.insertFirst(3, 3);
f.insertFirst(4, 4);
f.insertLast(1, 1);
f.insertLast(2, 2);
f.disPlay();
System.out.println("delete-------------");
f.deleteFirst();
f.disPlay();
}
//记录第一个链接点地址
public Link first;
//记录最后一个链接点地址
public Link last;
//初始化
public FirstLastList(){
first = null;
last = null;
}
//判断是否为空
public boolean isEmpty(){
return first == null;
}
//添加第一个链接点,这里和单向链表相识,不同的是当链表为空时,必须制定
//最后一个链接点的地址,否则就无法直接访问末尾的链接点,也就无法在链表尾部添加链接点。
public void insertFirst(int i, double d){
Link newLink = new Link(i,d);
//如果为空初始化末端链接点。此时,第一个链接点也就是最后一个链接点。
if(isEmpty()){
last = newLink;
}
//此处和单向一样,添加首个链接点,将节点的next指向当前的first
newLink.next = first;
//首个链接点指向新增加的链接点
first = newLink;
}
//增加末尾链接点,末尾添加的方向和添加首个链接点的方向相反。
public void insertLast(int i, double d){
Link newLink = new Link(i,d);
//如果为空,初始化首个链接点
if(isEmpty()){
first = newLink;
}else{
//此处和添加首节点不同,必须是不为空的时候才能操作,
//此处操作的末链接点的next.
last.next = newLink;
}
//更新末尾链接点地址
last = newLink;
}
//删除首节点
public void deleteFirst(){
if(isEmpty()){
System.out.println("list is null");
}else{
//如果首节点的下一个链接点为空,就将last置空
if(first.next == null){
last = null;
}
//变更首节点的位置。
first = first.next;
}
}
public void disPlay(){
Link current = first;
while(current!=null){
System.out.println(current.dData);
current = current.next;
}
}
}
//链接点对象
class Link{
public int iData;
public double dData;
//关系子段,用于存储下一个链接点的位置
public Link next;
public Link(int id, double dd){
this.iData = id;
this.dData = dd;
}
public void displayLink(){
System.out.println("{" + iData + "," + dData + "}");
}
}
- 大小: 45.7 KB
分享到:
相关推荐
本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...
本次实验的主要目的是理解和掌握线性数据结构——双端队列(Double-Ended Queue,简称deque)的实现与应用。通过实际编程,加深对双端队列特性的理解,如其在头部和尾部进行插入和删除操作的灵活性。同时,将双端...
本文将深入探讨队列的概念、实现方式以及其变种——双端队列(Deque)的原理和实现。 首先,我们需要了解什么是队列。队列是一种特殊的线性表,它只允许在表的一端进行插入操作,在另一端进行删除操作。这一行为...
本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...
数据结构课设——小大根交替堆实现的双端优先级队列及应用 小大根交替堆是一种特殊的堆结构,它可以同时满足大根堆和小根堆的性质。在本文中,我们将对小大根交替堆实现的双端优先级队列进行详细的分析和设计。 ...
1. **快速插入和删除**:由于`deque`内部使用链表实现,所以它在两端进行插入和删除操作的时间复杂度都是O(1),远优于列表的O(n)。 2. **线程安全**:`deque`是线程安全的,可以用于多线程环境下的数据共享。 3. *...
总结来说,"翻转链接"这个话题涉及了计算机科学中的核心概念——链表和其操作。理解并掌握链表翻转的算法不仅有助于解决实际编程问题,也是提升编程能力的关键步骤。在学习和实践中,我们应该不断锻炼自己的逻辑思维...
本压缩包包含对三种基本数据结构——栈、链表和队列的实现代码,这些都是编程基础中的基础。 首先,我们来详细了解栈(Stack)。栈是一种“后进先出”(LIFO)的数据结构,它的操作主要集中在一端,被称为栈顶。...
3. **实现方式**:双端队列可以通过数组或链表来实现。使用数组实现时需要注意边界问题;使用链表实现则更加灵活,适合频繁的操作场景。 ### 双端队列与栈和队列的区别 - **栈(Stack)**:栈是一种只能在一端进行...
———————————————— 版权声明:本文为CSDN博主「dwf1354046363」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:...
最后,队列和栈的组合——双端队列(Deque)在Java中由`java.util.Deque`接口定义,它允许在两端进行插入和删除操作,例如`ArrayDeque`。 了解和掌握这些数据结构以及它们在Java中的实现,对于提升编程能力,优化...
此外,还有一种特殊类型的队列——双端队列(Deque,Double Ended Queue),它允许在两端进行插入和删除操作,是栈和队列特性的结合,例如Java的java.util.Deque接口和C++的std::deque容器。 理解栈和队列的基本...
#### Deque——双端队列的高效性 `deque`是STL中的另一种容器,它支持在两端进行高效的插入和删除操作。与`vector`相比,`deque`的内存布局更为复杂,但在某些场景下能提供更好的性能。`deque`同样支持多种构造函数...
《C++实用教程》第16章主要介绍了标准模板库(STL)中的核心概念——迭代器和容器类。在STL中,迭代器扮演着关键角色,它被设计成一种特殊的指针,用于指向容器内元素的位置。迭代器的出现使得针对不同容器的算法...
3. 高级数据结构实现:如Java的`java.util.Queue`接口,提供了多种队列实现,如`ArrayDeque`(基于数组的双端队列)、`LinkedList`(链表实现)等。 队列的应用场景: 1. 打印机任务调度:新任务入队,完成的任务出...
Redis的列表是通过链表或者双端队列实现的,提供了丰富的列表操作命令,如`lpush`和`rpush`用于在列表的头部和尾部插入元素,`lrange`用于获取列表中指定范围的元素。 #### 集合(Set) 集合是一个无序的字符串集合...
- **Deque**: 双端队列,两端都可以进行插入和删除操作,适用于需要快速访问两端元素的应用。 ##### 2. 算法 - **Sort**: 快速排序、归并排序等多种排序算法的实现方式和性能分析。 - **Find**: 如何利用标准算法...