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. pylab模式

    启动IPython时ipython --pylab就可以进入pylab模式,这种模式下画图时图片不会直接蹦出来,而是嵌在交互环境中,当然sypder里自动是pylab模式了

  2. canvas加载进度条

    <!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content=& ...

  3. 【微信Java开发 --1---番外1】在windows下,使用JAVA执行多条DOS命令+文件夹/路径中有空格怎么解决【目的是实现内容穿透外网】

    内网穿透外网的那一篇,参正集1 但是每次都要Ctrl+R 启动DOS窗口,也就是CMD,一句一句的去粘,略显繁琐. 所以将这些任务写在JAVA程序中,启动一次程序就可以实现[内网穿透]的功能,多好啊! ...

  4. 【bootstrapValidator 不验证】使用bootstrapValidator 验证效果不起作用

    虽然在页面ready的时候 就绑定了验证表单 ,但是在点击提交按钮之后 依旧没有验证的效果 . 那就在提交按钮的点击事件中 添加一句话: $(document).ready( function () ...

  5. EventBus的使用,数据传递

    通常情况下安卓下数据的传递有下面几种方法: 1.通过intent传递,包括显式意图和隐式意图,广播(Broadcast)和服务都能通过Intent传递 传递的数据类型包括8大基本数据类型    实现P ...

  6. java 日历代码实现

    System.out.println("请输入日期(按照格式:2030-3-10):"); //在控制台输入 //String str="2016-9-26"; ...

  7. css -- 布局元素

    默认情况下拥有布局的元素:HTML ,table,tr,td,img,hr,input,select,textarea,button,iframe,embed,object,applet,marque ...

  8. Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法2 - SingleLaunchActivityTestCase

    本文来源于:http://blog.csdn.net/zhubaitian/article/details/39296753 在上一遍笔记博客中本以为只能在Setup和TearDown中做条件判断来实 ...

  9. Javascript-jQuery【1】-用promise()实现html()回调函数

    $('#divId').html(someText).promise().done(function(){ //your callback logic / code here });

  10. UVa12264 Risk(最大流)

    题目 Source https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...