1、创建节点类

public class CNode<T> {
public CNode prev;
public CNode next;
public T data; public CNode() {
} public CNode(T data) {
this.data = data;
}
}

2、实现类

public class DoubleLinkNode<T> {

    /**
* 初始化
*
* @param head
*/
public void init(CNode head) {
head.prev = head;
head.next = head;
} /**
* 插入
*
* @param head:插入对应链表
* @param index:插入的位置
* @param element: 对应位置插入的元素
*/
public void insert(CNode head, int index, T element) {
CNode temp = head;
CNode<T> newnode = new CNode<>(element);
int j = -1;
while (temp.next != head && j < index - 1) {
temp = temp.next;
j++;
} if (j != index - 1) {
System.out.println("插入的下标有问题");
return;
}
newnode.next = temp.next;//---->
temp.next.prev = newnode;//<----
newnode.prev = temp;//---->
temp.next = newnode;//<---
} /**
* 删除
* @param head:所要删除的链表
* @param index :删除的元素下标
*/
public void delete(CNode head, int index) {
CNode temp = head;
int j = -1;
if (temp.next == head) {
System.out.println("链表为空,没有元素可删除");
return;
}
while (temp.next.next != head && j < index - 1) {
temp = temp.next;
j++;
} if (j != index - 1) {
System.out.println("删除元素位置下标出错");
return;
}
temp.next = temp.next.next;
temp = temp.next.next.prev;
} public void indexGetElement(CNode head,int index) {
CNode temp = head;
int j = -1;
if (temp.next == head){
System.out.println("为空,无法获取你要的值");
return;
}
while (temp.next != head && j< index){
temp = temp.next;
j++;
}
if (j != index){
System.out.println("您给的下标有问题");
return;
}
System.out.println("您要获取的值:"+temp.data);
} /**
* 求当前元素个数
*
* @param head
*/
public void getLength(CNode head) {
CNode temp = head;
int length = 0;
if (temp.next == head) {
System.out.println("链表为空,长度为0");
return;
}
while (temp.next != head) {
temp = temp.next;
length++;
}
System.out.println("长度为: " + length);
} /**
* 打印
*
* @param head
*/
public void print(CNode head) {
CNode temp = head;
if (temp.next == head) {
System.out.println("链表为空,没有可打印元素");
return;
}
while (temp.next != head) {
temp = temp.next;
System.out.print(temp.data + " ");
}
System.out.println();
} public static void main(String[] args) {
CNode<Integer> cNode = new CNode<>();
DoubleLinkNode doubleLinkNode = new DoubleLinkNode();
doubleLinkNode.init(cNode);
doubleLinkNode.indexGetElement(cNode,0); doubleLinkNode.insert(cNode, 0, 8);
doubleLinkNode.insert(cNode, 0, 7);
doubleLinkNode.getLength(cNode);
doubleLinkNode.print(cNode);
for (int i = 0; i < 5; i++) {
doubleLinkNode.insert(cNode, i, i);
} doubleLinkNode.print(cNode);
doubleLinkNode.getLength(cNode); doubleLinkNode.delete(cNode,6);
doubleLinkNode.print(cNode);
doubleLinkNode.getLength(cNode); doubleLinkNode.indexGetElement(cNode,5);
}
}

3、实验结果

为空,无法获取你要的值
长度为: 2
7 8
0 1 2 3 4 7 8
长度为: 7
0 1 2 3 4 7
长度为: 6
您要获取的值:7

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

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

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

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

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

  3. java实现双向循环链表

    java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html 在单链表中,查询下一个元素的时间是O(1).查询上一个元素的时间却是O(n). 为 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. pythonday02基础与运算符

    今日概要 1.循环 2.字符串格式化 3.运算符 4.编码 if的嵌套 score = input('请输入成绩') score_int = int(score) if score_int >= ...

  2. Yii的srbac拓展中“用户已经获授权项”无法查看

    Yii的srbac拓展中“用户已经获授权项”点下拉框,选择一个有权限的用户时,根本无法列出权限. 原因是srbac把数据库的表中的ID默认为数字,像 123这样,但如果不是数字像这样 'y0f22ff ...

  3. vue中的v-if和v-show的区别

    v-if和v-show的区别是前端面试中常问的基础知识点,v-if.v-show顾名思义就是用来判断视图层展示效果的.那么具体是怎么展示呢?v-if和v-show的区别又是什么呢? 首先我们可以来看一 ...

  4. app登录接口请求报:“签名验证失败”???已解决

    根据抓包数据获得url.param.header,在charles中compose请求结果为成功,在pycharm中运行则报:“签名验证失败”. 运行结果:

  5. Spring Boot 默认指标从哪来?

    了解有关 Spring Boot 默认指标及其来源的更多信息. 您是否注意到 Spring Boot 和 Micrometer 为您的应用生成的所有默认指标? 如果没有 - 您可以将 actuator ...

  6. 随笔编号-01 如何比较日期类型的String 大小浅谈.

    有三种解决方法: 第一种直接用字符串类的compareTo方法: String t1="20160707"; String t2="20160708"; int ...

  7. 怒改springMVC项目为springBoot项目

    背景:公司最近在做项目升级,融合所有项目,但是目前使用的一个系统还是最原始的框架 springMVC+spring+mybatis ,前端还是jsp,easyui(技术老的掉牙),终于出手了,结果.. ...

  8. 微擎 人人商城 增加营收比统计(即每个订单支持多少,收入多少,总得统计)多表联合查询, sum统计一对多总和 联合 group by 进行查询

    在公司要求增加一项统计,即营收比, 每个订单收入多少 支出多少,盈利多少,盈利比都详细记录下来. 在做完针对单个订单的营收比之后(支出储存在 ewei_shop_order_external_pay ...

  9. JPA多条件复杂SQL动态分页查询

    概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...

  10. HDU 1045 Fire Net 二分图建图

    HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...