java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html

在单链表中,查询下一个元素的时间是O(1)。查询上一个元素的时间却是O(n)。

为了克服这种缺点,我们开始学习双向链表。

双向链表类的代码:

package doublelinkedlist;

public class DoubleLinkedList {

	class Element
{
private Element prior=null;
public Object value=null;
private Element next=null;
} private Element header = null;//头结点 /**
* 初始化链表
* */
void initList()
{
header = new Element();
header.prior=header;
header.value=null;
header.next=header;
} /**
* 向链表中第i个位置插入元素o
* */
void insertList(Object o,int i)
{
if(i<=0||i>size())
{
System.out.println("插入位置不合法!链表长度为:"+size());
}else
{
Element e = new Element();
e.value=o;
if(header.prior==header)//第一次插入元素
{
e.prior=header;
e.next=header;
header.next=e;
header.prior=e;
}else if(i==size())//在最后插入
{
System.out.println("在链表尾部插入");
e.next=header;
e.prior=header.prior;
header.prior.next=e;
header.prior=e; }else
{
Element temp = header;
int count=0;
while(temp.next!=header)
{
count++;
if(count == i)
{
e.prior=temp;
e.next=temp.next;
temp.next.prior=e;
temp.next=e;
}
temp=temp.next;
}
}
} }
/**
* 删除链表中的某个元素
* */
void deleteList(int i)
{
if(i<=0||i>size())
{
System.out.println("插入位置不合法!链表长度为:"+size());
}else
{
int count=0;
Element temp = header;
while(temp.next!=header)
{
temp=temp.next;
count++;
if(i==count)
{
//删除第i个元素
temp.next.prior=temp.prior;
temp.prior.next=temp.next;
}
}
}
}
/**
* 打印链表
* */
void print()
{
System.out.print("打印双向循环链表:");
Element temp = header;
while(temp.next!=header)
{
System.out.print(temp.next.value+"\t");
temp=temp.next;
}
System.out.println();
}
/**
* 获取链表的大小
* */
int size()
{
int count=1;
Element temp = header;
while(temp.next!=header)
{
count++;
temp=temp.next;
}
return count;
}
}

双向链表的测试类

package doublelinkedlist;

public class DoubleLinkedListMain {

	public static void main(String[] args) {
DoubleLinkedList dlList = new DoubleLinkedList();//有头结点
dlList.initList();
dlList.insertList(1, 1);
dlList.insertList(2, 2);
dlList.insertList(3, 1);
dlList.insertList(4, 1);
dlList.insertList(5, 1);
dlList.insertList(6, 6);
dlList.print();
dlList.deleteList(3);
dlList.print();
} }

  

java实现双向循环链表的更多相关文章

  1. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  2. (java实现)双向循环链表

    什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...

  3. Java 用双向循环链表实现 遍历

    package day2; /** * 构建双向循环链表,实现遍历功能 */public class DoubleLB { public static void main(String[] args) ...

  4. 双向循环链表的Java版本实现

    1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...

  5. java数据结构-06双向循环链表

    双向循环链表跟单向链表一样,都是头尾相连,不过单向是尾指向头,双向是头尾互相指,可以从前往后查,也可以从后往前查 无头结点的双向循环链表 public class CircleLinkedList&l ...

  6. "《算法导论》之‘线性表’":双向循环链表

    本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中 ...

  7. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  8. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  9. c语言编程之双向循环链表

    双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...

随机推荐

  1. Linux-数据库1

    数据库介绍 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种 ...

  2. MySQL笔记(五)之表的连接

    MySql数据库中表的连接一共有如下几种 INNER JOIN 内连接 语法: SELECT column_name(s) FROM table_name1 INNER JOIN table_name ...

  3. Hibernate 双向一对多的关联映射

    双向的一对多的关联关系是单项的一对多和单项的多对一的情况下产生的. 1.设计表结构 虽然关联关系变为双向的一对多,但是我们表结构不会发生改变,只是指向变了. 2.创建student对象 3.创建Gra ...

  4. 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 426  Solved: 255 Description 小Y是 ...

  5. Codeforces 521 E cycling city

    cf的一道题,非常有意思,题目是问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 其实就是判断一下是否为仙人掌就行了,如果不是仙人掌的话肯定就存在,题目难在输出路径上,改了半 ...

  6. Android之View / SurfaceView / GLSurfaceView

    Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:view.SurfaceView和GLS ...

  7. [GCJ2017R2]Fresh Chocolate

    题目大意: 有n个团和很多盒糖,每个团中人数不一定相同,每盒糖中都有p颗糖. 现在要给每个团发糖,要求每个人都要发到糖,只有一盒糖发完后才能发下一盒糖. 发糖的顺序可以任意安排,问经过合理安排后,最多 ...

  8. JavaScript学习笔记 isPrototypeOf和hasOwnProperty使用区别

    1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object ...

  9. WEB安全扫描器Netsparker推荐给大家

    Netsparker是一款综合型的web应用安全漏洞扫描工具,它分为专业版和免费版,免费版的功能也比较强大. Netsparker与其他综合 性的web应用安全扫描工具相比的一个特点是它能够更好的检测 ...

  10. d3.js 实现立体柱图

    前言 随着大数据时代的来临,数据可视化的重要性也越来越凸显,那么今天就基于d3.js今天给大家带来可视化基础图表柱图进阶:立体柱图 关于d3.js d3.js是一个操作svg的图表库,d3封装了图表的 ...