1.链表是一种重要的数据结构,在程序设计中占有很重要的地位

2.我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技 巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢? 这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一 个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种 操作。例如reset()方法使第一个结点成为当前结点。insert(Object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最 后一个结点,则第一个结点变为当前结点。

 /**
* 双向链表的实现
* @author Skip
* @version 1.0
*/
public class DoubleNodeList<T> {
//节点类
private static class Node<T>{
Node<T> perv; //前节点
Node<T> next; //后节点
T data; //数据 public Node(T t){
this.data = t;
}
}
private Node<T> head; //头节点
private Node<T> last; //尾节点
private Node<T> other; //备用节点存放临时操作
private int length; //链表长度 /**
* 无参构造
*/
public DoubleNodeList(){
head = new Node<T>(null);
last = head;
length = 0;
} /**
* 初始化时创建一个节点
* @param data 数据
*/
public DoubleNodeList(T data){
head = new Node<T>(data);
last = head;
length = 1;
} /**
* 添加一个节点
* @param data 添加的数据
*/
public void add(T data){
if(isEmpty()){
head = new Node<T>(data);
last = head;
length++;
}else{
//尾插法
other = new Node<T>(data);
other.perv = last;
last.next = other;
last = other;
length++;
}
} /**
* 在指定数据后插入一个节点
* @param data 指定的数据
* @param insertData 插入的数据
* @return 插入成功返回true,不成功返回false
*/
public boolean addAfert(T data , T insertData){
other = head;
while(other != null){
if(other.data.equals(data)){
Node<T> t = new Node<T>(insertData);
t.perv = other;
t.next = other.next;
other.next = t;
//判断是否在最后一个节点后添加节点
if(t.next==null){
last = t;
}
length++;
return true;
}
other = other.next;
}
return false;
} /**
* 在指定数据前插入一个节点
* @param data 指定的数据
* @param insertData 插入的数据
* @return 插入成功返回true,不成功返回false
*/
public boolean addBefore(T data, T insertData){
other = head;
while(other != null){
if(other.data.equals(data)){
Node<T> t = new Node<T>(insertData);
t.perv = other.perv;
t.next = other;
other.perv.next = t;
length++;
return true;
}
other = other.next;
}
return false;
} /**
* 获得索引处的数据
* @param index 索引
* @return 数据
*/
public T get(int index){
if(index>length || index<0){
throw new IndexOutOfBoundsException("索引越界:"+index);
}
other = head;
for(int i=0;i<index;i++){
other = other.next;
}
return other.data;
} /**
* 新值替换旧值
* @return 成功为true,未找到为false
*/
public boolean set(T oldValue,T newValue){
other = head;
while(other!=null){
if(other.data.equals(oldValue)){
other.data = newValue;
return true;
}
other = other.next;
}
return false;
} /**
* 移除指定的元素
* @param data 需要移除的元素
* @return 不存在为false,成功为true
*/
public boolean remove(T data){
other = head;
while(other != null){
if(other.data.equals(data)){
other.perv.next = other.next;
length--;
return true;
}
other = other.next;
}
return false;
} /**
* 链表中是否包含此元素
* @return 包含为true,不包含为false
*/
public boolean contains(T data){
other = head;
while(other != null){
if(other.data.equals(data)){
return true;
}
other = other.next;
}
return false;
} /**
* 获得最后一个节点的数据
* @return 最后一个节点的数据
*/
public T getLast(){
return last.data;
} /**
* 获得第一个节点的数据
* @return 第一个节点的数据
*/
public T getFirst(){
return head.data;
} /**
* 获得链表的长度
* @return 长度
*/
public int getSize(){
return length;
} /**
* 是否为空链表
* @return 空链表为true,非空链表为false
*/
public boolean isEmpty(){
return length==0;
} /**
* 清空链表
*/
public void clear(){
head = null;
length = 0;
} /**
* 输出链表内所有节点
*/
public void printList(){
if(isEmpty()){
System.out.println("空链表");
}else{
other = head;
for(int i=0;i<length;i++){
System.out.print(other.data+" ");
other = other.next;
}
System.out.println();
}
}
}

JAVA双向链表的更多相关文章

  1. Java双向链表实现

    public class DoublyLinkList { private class Data{ private Object obj; private Data left = null; priv ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...

  4. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  5. 大话数据结构(八)Java程序——双向链表的实现

    线性链表--双向链表 双向链表定义: 双向链表(double linked list): 是在单表单的每个结点中,再设置一个指向前驱结点的指针域.因此,在双向链表中的结点都有两个指针域,一个指向前驱, ...

  6. 线性链表的双向链表——java实现

    .线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...

  7. Java中双向链表的代码实现

    写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节 ...

  8. 双向链表--Java实现

    /*双向链表特点: *1.每个节点含有两个引用,previos和next,支持向前或向后的遍历(除头节点) *2.缺点插入或删除的时候涉及到引用修改的比较多 *注意:下面的双向链表其实也实现了双端链表 ...

  9. JAVA实现双向链表的增删功能

    JAVA实现双向链表的增删功能,完整代码 package linked; class LinkedTable{ } public class LinkedTableTest { //构造单链表 sta ...

随机推荐

  1. loj 1412(树上最长直径的应用)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1412 思路:好久没写题解了,有点手生,这题从昨天晚上wa到现在终于是过了...思想其实 ...

  2. 【java基础】选择排序and冒泡排序

    前言 : 今天学习的是J2SE视频里的第五章,数组部分,它里面留了一个经典的作业,就是让我们去从1倒9按一定规格排序,这让我想起了学习vb的时候最最让我头疼的两种排序方法,选择排序法 和 冒泡排序法. ...

  3. codeforces724-A. Checking the Calendar 日期题

    首先有这样一个显然的事实,那就是每个月的第一天可以是星期x,x可以取遍1~7 因为日期一直在往后退,总有一年能轮到分割线那天,因为本来其实压根就没有月份的划分,月份划分是人为的 而且我们也不知道开始的 ...

  4. 【SQL Sever】实现SQL Sever的发布。订阅。 双机热备

    实现SQL Sever的发布和订阅  最大的好处就是: 可以实现读写分离,增删改操作在主数据库服务器上进行,查询在备份数据库服务器上进行.一方面提高软件执行效率,另一方面也减轻主库压力. 本次实现发布 ...

  5. lr_think_time参数化

    深圳湖北籍软件测试群 275212937

  6. vim 清空

    插入模式 首先执行gg 跳至文件首行 然后执行dG就清空了整个文件 还有一种方法就要退出VIM,然后使用echo > file ,这样也能快速清空文件内容

  7. APK瘦身实践

    首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...

  8. 插入视频(youtube)

    iframe 如果没有flash播放器,会自动使用html5播放器 <iframe width="420" height="315" src=" ...

  9. Swift3.0语言教程获取C字符串

    Swift3.0语言教程获取C字符串 Swift3.0语言教程获取C字符串,为了让Swift和C语言可以实现很好的交互,开发者可以使用NSString的cString(using:)方法在指定编码格式 ...

  10. 【面经】【转】C程序的内存布局

    一个C语言程序一直以来都是由以下5个段组成: 1.代码段(text segmrnt):存放CPU执行的机器指令,通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在没存中有有 ...