java实现双向循环链表
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实现双向循环链表的更多相关文章
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- (java实现)双向循环链表
什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...
- Java 用双向循环链表实现 遍历
package day2; /** * 构建双向循环链表,实现遍历功能 */public class DoubleLB { public static void main(String[] args) ...
- 双向循环链表的Java版本实现
1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...
- java数据结构-06双向循环链表
双向循环链表跟单向链表一样,都是头尾相连,不过单向是尾指向头,双向是头尾互相指,可以从前往后查,也可以从后往前查 无头结点的双向循环链表 public class CircleLinkedList&l ...
- "《算法导论》之‘线性表’":双向循环链表
本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中 ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- c语言编程之双向循环链表
双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...
随机推荐
- Django Restframework 实践(二)
按照自己的方法来写接口 ''' @api_view([ 'POST','GET',]) 允许请求的是get或post方法,这里去掉get那么就不能用get方法请求 @permission_classe ...
- 交叉编译iperf源代码
<Iperf简介> Iperf 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失. &l ...
- FastReport.Net使用:[37]报表继承
1.设计一个基础报表,将其保存为BaseReport. 2.新建一个继承的报表. 通过 文件-->新建 打开“新建对象”向导.选择“继承的报表”,点击确定. 3. 在打开对话框中选择基础报表Ba ...
- luoguP4206 [NOI2005]聪聪与可可 期望概率DP
首先,分析一下这个猫和鼠 猫每局都可以追老鼠一步或者两步,但是除了最后的一步,肯定走两步快些.... 既然猫走的步数总是比老鼠多,那么它们的距离在逐渐缩小(如果这题只能走一步反而不能做了...) 猫不 ...
- scanf输入字符串相关
http://blog.csdn.net/liuhui_8989/article/details/13398793 补充..输入s的时候不要把变量设置成string类型,设置成char数组类型.. ...
- 2018BNU校赛总决赛
题解是qls的题解我就懒得写了23333 A塞特斯玛斯塔 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld ...
- 【UOJ244】[UER7]短路
[题目大意] (2n+1)*(2n+1)的矩形,由里到外每一层都有一个相同的值.问从左上走到右小经过的点累和的最小值. [思路] 一眼就是贪心.首先能够想到的是,权值最小的那些边要尽可能夺走,所以必定 ...
- bzoj 1468
大概思路:树点分治,重心树中每个重心维护一个总的平衡树,树中保存属于该重心的点到该重心的距离,然后对于去掉该重心后形成的子树分别再保存一份. 用这种方式实现的话,还可以支持修改与多次查询,每次操作都是 ...
- 如何判断c语言的变量类型
变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...
- PAT甲级1049. Counting Ones
PAT甲级1049. Counting Ones 题意: 任务很简单:给定任何正整数N,你应该计算从1到N的整数的十进制形式的1的总数.例如,给定N为12,在1,10, 11和12. 思路: < ...