3.1、双向循环链表(java实现)
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实现)的更多相关文章
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- 双向循环链表的Java版本实现
1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...
- java实现双向循环链表
java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html 在单链表中,查询下一个元素的时间是O(1).查询上一个元素的时间却是O(n). 为 ...
- (java实现)双向循环链表
什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...
- Java 用双向循环链表实现 遍历
package day2; /** * 构建双向循环链表,实现遍历功能 */public class DoubleLB { public static void main(String[] args) ...
- 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 ...
随机推荐
- eclipse项目导入idea jdk版本不一致😵
在导入eclipse项目到idea过程中遇到 Imported project refers to unkonwn jdks JavaSE-1.8 解决方法: file --> Project ...
- 从零开始学习GDI+ (一)
前言: GDI+从Windows XP操作系统(大概2002-2003年)开始引入的,现在都9102年了,再学习这么古老的技术肯定是过时了.windows桌面程序没落了,随着移动的兴起,用户被惯坏了, ...
- Django-内置用户系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括 1.用户注册 2.用户登录 3.用户认证 4.注销 5.修改密码 Django作为一个 ...
- vscode保存代码,自动按照eslint规范格式化代码设置
# vscode保存代码,自动按照eslint规范格式化代码设置 编辑器代码风格一致,是前端代码规范的一部分.同一个项目,或者同一个小组,保持代码风格一致很必要.就拿vue项目来说,之前做的几个项目, ...
- python对接常用数据库,快速上手!
python对接常用数据库,快速上手! 很多同学在使用python进行自动化测试的时候,会涉及到数据库数据校验的问题,因为不知道如何在python中如何对数据库,这个时候会一脸茫然,今天在这里给大家汇 ...
- shiro实现session共享(本文转自店蛋蛋)
session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题. 假设:用户第一次访问,连接的A服务器 ...
- ssh通过pem文件登陆服务器
一些为了安全操作,推荐使用私钥进行登录服务器,拿jenkins来说,默认的验证方式就是私钥 实现方式 先在本机通过ssh-keygen直接生成公私钥 如下在当前文件夹下生成my.pem(私钥)和my. ...
- JVM内存机制与垃圾收集器总结
本文目录 1. JVM内存组成结构 2. JVM内存回收 3. 垃圾收集器与算法 4. jdk1.6中class文件结构 5. jdk1.6 1.7 1.8比较 1. JVM内存组成结构 JVM栈由堆 ...
- Codeforces 1008C
题意略. 思路: 其实我们没有必要关注每个数字的位置,我们只要把大的数字放在小的数字上就可以了,这样它的位置必然会发生变换. 在变换时,这个替换的序列越长越好,每个序列对答案的贡献就是该序列的长度 - ...
- Linux之Shell编程(16)
读取从控制台输入的值(read): 系统函数: basename:返回完整路径最后/部分,常用于获取文件名 basename [pathname] [suffix] dirname:返回完整路径最后/ ...