Java数据结构——双向链表

什么是双向链表?
每一个结点不仅配有next引用,同时还有一个prev引用,指向其上一个结点(前驱结点), 没有前驱的时候就为NULL。

(以下图片均来自网络,侵删)

与单链表的区别?
和单向链表相比有以下优势:

  1. 插入删除不需要移动元素外,可以原地插入删除
  2. 可以双向遍历

插入操作

删除操作

实现

public class DLNode {
Object data;
DLNode prev;
DLNode next;
static DLNode head;
static DLNode tail;

// 无参构造
public DLNode() {
super();
}

// 有参构造
public DLNode(Object data, DLNode prev, DLNode next) {
super();
this.data = data;
this.prev = prev;
this.next = next;
}

// 获取数据
public Object getData() {
return data;
}

// 修改数据
public void setData(Object data) {
this.data = data;
}

// 得到前驱结点
public DLNode getPrev() {
return prev;
}

// 修改前驱结点
public void setPrev(DLNode prev) {
this.prev = prev;
}

// 获取后驱结点
public DLNode getNext() {
return next;
}

// 修改后驱结点
public void setNext(DLNode next) {
this.next = next;
}

// 获取长度
public static int getLength() {
int count = 0;
for (DLNode n = head; n != null; n = n.next) {
count++;
}
return count;
}

// 插入结点
public static void add(Object data, int index) {
DLNode node = new DLNode(data, null, null);
if (index == 0) {
node.next = head;
node.prev = null;
head = node;
} else if (index == getLength()) {
tail.next = node;
node.prev = tail;
tail = node;

} else {
int temp = 0;
for (DLNode n = head; n != null; n = n.next) {
temp++;
if (temp == index) {
node.next = n.next;
n.next.prev = node;
n.next = node;
node.prev = n;
break;
}
}
}
}

//删除结点
public static void remove(int index) {
if (index == 0) {
head = head.next;
head.prev = null;
} else if (index == getLength() - 1) {
tail = tail.prev;
tail.next = null;
} else if (index >= getLength()) {
System.out.println("超出链表长度");
System.exit(0);
} else {
int temp = 0;
for (DLNode n = head; n != null; n = n.next) {
temp++;
if (temp == index) {
n.next = n.next.next;
n.next.prev = n;
break;
}
}
}
}

public static void main(String[] args) {
DLNode node1 = new DLNode("aaa", null, null);
DLNode node2 = new DLNode("bbb", node1, null);
DLNode node3 = new DLNode("ccc", node2, null);
DLNode node4 = new DLNode("ddd", node3, null);
node3.setNext(node4);
node2.setNext(node3);
node1.setNext(node2);
head = node1;
tail = node4;
System.out.print("当前链表:");
for (DLNode n = head; n != null; n = n.next) {
System.out.print(n.data + " ");
}
System.out.println();
System.out.println("链表长度:" + getLength());
add("eee", 4);
System.out.print("插入后链表:");
for (DLNode n = head; n != null; n = n.next) {
System.out.print(n.data + " ");
}
System.out.println();
remove(0);
System.out.print("删除后链表:");
for (DLNode n = head; n != null; n = n.next) {
System.out.print(n.data + " ");
}
}
}

  

原文地址:https://www.cnblogs.com/ericz2j/p/10459356.html

时间: 2024-08-01 02:46:55

Java数据结构——双向链表的相关文章

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

Java数据结构和算法(一)——开篇

这篇文章里面不讲技术,抽空讲讲技术和通俗之间有一种奇特的关系,还有驱动力学习的东西. 1)技术与通俗 大学里面那本严蔚敏的数据结构不厚,内容丰富,但是复杂问题的讲解方面篇幅这样就少了,比较难理解,c也不是很擅长,但是基本的思路还是有的. 简单的链表,数组,堆栈,队列,图,几个排序算法. 后面看到知乎涛吴的回答,当时很震撼,这里引用一下他的回答: 如果说 Java 是自动档轿车,C 就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

Java数据结构之线性表

从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的几张,我们将会分别讲解这几种数据结构,主要也是通过Java代码的方式来讲解相应的数据结构. 今天要讲解的是:Java线性结构 Java数据结构之线性结构 说到线性结构的话,我们可以根据其实现方式分为三类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表 1.顺序结构的线性表    

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set