概念:
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,
分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,
都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
实现方式:构造一个常驻内存的头节点引用,然后头节点的上一个节点是最后一个节点,最后
一个节点的下一个是头节点。其他的每个节点都有上下节点的引用。最少有一个头节点
操作:构造链表,销毁链表,计算元素个数,返回链表中指定链表中元素的值,插入元素,删除元素
代码:
package com.alg.link;
import java.util.Iterator;
//双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,
//分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,
//都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
//链表的操作有:构造链表,销毁链表,计算元素个数,返回链表中指定链表中元素的值,插入元素,删除元素
public class DoubleWayLinkedList<T> extends BaseLinkedList<T>
{
transient Link<T> voidLink;
public DoubleWayLinkedList()
{
voidLink = new Link<T>(null, null, null);
voidLink.previous = voidLink;
voidLink.next = voidLink;
}
// 向尾部添加
@Override
public void add(T object)
{
Link<T> oldLast = voidLink.previous;
// 末尾的上一个是最后一下,下一个是第一个
Link<T> newLink = new Link<T>(object, oldLast, voidLink);
voidLink.previous = newLink;
oldLast.next = newLink;
modCount++;
size++;
}
@Override
public void clear()
{
if (size > 0)
{
size = 0;
voidLink.next = voidLink;
voidLink.previous = voidLink;
modCount++;
}
}
@Override
public T get(int location)
{
if (0 <= location && location < size)
{
Link<T> link = voidLink;
if (location < (size / 2))
{
for (int i = 0; i <= location; i++)
{
link = link.next;
}
}
else
{
for (int i = size; i > location; i--)
{
link = link.previous;
}
}
return link.data;
}
return null;
}
// 移除某个元素
@Override
public T remove(int location)
{
if (0 <= location && location < size)
{
Link<T> link = voidLink;
if (location < (size / 2))
{
for (int i = 0; i <= location; i++)
{
link = link.next;
}
}
else
{
for (int i = size; i > location; i--)
{
link = link.previous;
}
}
Link<T> previous = link.previous;
Link<T> next = link.next;
previous.next = next;
next.previous = previous;
size--;
modCount++;
return link.data;
}
return null;
}
// 可以加入空的数据,所以有object为null的移除,而且移的是第一个数据为null的
@Override
public boolean remove(Object object)
{
Link<T> link = voidLink.next;
if (object != null)
{
while (link != voidLink && !object.equals(link.data))
{
link = link.next;
}
}
else
{// 如果data为null,则碰到了第一个空数据
while (link != voidLink && link.data != null)
{
link = link.next;
}
}
if (link == voidLink)
{
return false;
}
Link<T> next = link.next;
Link<T> previous = link.previous;
previous.next = next;
next.previous = previous;
size--;
modCount++;
return true;
}
@Override
public int size()
{
return size;
}
public Iterator<T> iterator()
{
return new SimpleIterator();
}
}
分享到:
相关推荐
数据结构实验--链表进行多项式求和与求积 数据结构实验--链表进行多项式求和与求积 数据结构实验--链表进行多项式求和与求积 数据结构实验--链表进行多项式求和与求积 数据结构实验--链表进行多项式求和与求积
Java 数据结构 链表 Java链表 数据结构链表
实现双向链表的定义,冒泡排序,插入,删除,输出,反向。
算法-数据结构和算法-8-双向链表.rar
数据结构-链表 JAVA语言实现,包含单向链表、双向链表、循环链表的遍历、删除和插入 详细介绍:http://blog.csdn.net/z740852294/article/details/77369439
【数据结构与算法 - 链表】 C语言实现 实现模块化
严蔚敏-数据结构--链表实现c++实现 还不错哦!``
数据结构与算法--链表 很好的哦 欢迎下载
本程序的主要目的在于帮助同学熟练掌握线性表的基本操作在链式存储结构上的...通过本实验, 对链表基本操作及其组合应用的演练,加深对链表存储方法及其基本操作的理解,为以后进 一步学习更复杂的数据结构打下基础。
数据结构-链表-倒置.eddx
数据结构-链表 单向链表,双向链表、循环链表等
数据结构与算法-链表(线性表的链表表示和实现) 定义线性表节点的结构.pdf
数据结构链表和顺序表实验源码,没有实验报告,需要下载。
数据结构实验2-链表基本运算的实现.rar
图和代码相结合,详细讲解静态链表。通过生动活泼的对话让读者理解内村动态申请。
该程序采用C语言,利用到数据结构-链表的相关知识实现通讯录管理系统,用文本方式存储数据。
Java语言编写的数据结构-链表实现。包括顺序表和单链表、双链表
数据结构--双链表的操作---带头节点
链表实战题目4 - 链表入环的第一个节点给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos