`
coach
  • 浏览: 383067 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

LinkedList学习(双向循环链表)

 
阅读更多
/**
 * 双向循环链表测试
 * @author coach
 * @param <E>
 */
public class Node<E> 
{
    private E element;            //结点数据
    private Node<E> next;        //上结点
    private Node<E> previous;    //下结点
    private static int size=0;    //链表长

    //默认关结点next previous都是空,
    public Node()
    {
        this.element=null;
        this.next=null;
        this.previous=null;
    }
    
    private Node(E element,Node<E> next,Node<E> previous)
    {
        this.element=element;
        this.next=next;
        this.previous=previous;
    }

    /**
     * 尾部添加元素 e
     * @param e
     */
    public void addAfter(E e)
    {
        //定义新结点,next-->头结点;previous-->头结点.previous(尾结点)
        Node<E> newNode=new Node<E>(e,this,this.previous==null?this:this.previous);
        //头结点next为空则让它指向newNode
        if(this.next==null)
        {
            this.next=newNode;
        }
        //头结点previous为空则让它指向newNode
        if(this.previous==null)
        {
            this.previous=newNode;
        }
        this.previous.next=newNode;
        this.previous=newNode;
        size++;
    }
    /**
     * 头部添加元素 e
     * @param e
     */
    public void addBefor(E e)
    {
        Node<E> newNode=new Node<E>(e,this.next==null?this:this.next,this);
        if(this.next==null)
        {
            this.next=newNode;
        }
        if(this.previous==null)
        {
            this.previous=newNode;
        }
        this.next.previous=newNode;
        this.next=newNode;
        size++;
    }
    /**
     * 在index处添加元素e
     * @param e
     * @param index
     */
    public void add(E e,int index)
    {
        //索引越界
        if(index>=size || index<0)
        {
            throw new IndexOutOfBoundsException("Node.get():"+index);
        }
        else
        {
            //index>size/2,反向遍历
            if(index>size>>1)
            {
                Node<E> temp=this;
                for(int i=size;i>index;i--)
                {
                    temp=temp.previous;
                }
                Node<E> newNode=new Node<E>(e,temp,temp.previous);
                temp.previous.next=newNode;
                temp.previous=newNode;
            }
            else
            {
                Node<E> temp=this;
                for(int i=0;i<=index;i++)
                {
                    temp=temp.next;
                }
                Node<E> newNode=new Node<E>(e,temp,temp.previous);
                temp.previous.next=newNode;
                temp.previous=newNode;
            }
            size++;
        }
    }
    /**
     * 删除第index个元素
     * @param index
     */
    public void remove(int index)
    {
        //索引越界
        if(index>=size || index<0)
        {
            throw new IndexOutOfBoundsException("Node.get():"+index);
        }
        else
        {
            //index>size/2,反向遍历
            if(index>size>>1)
            {
                Node<E> temp=this;
                for(int i=size;i>index;i--)
                {
                    temp=temp.previous;
                }
                temp.previous.next=temp.next;
                temp.next.previous=temp.previous;
            }
            else
            {
                Node<E> temp=this;
                for(int i=0;i<=index;i++)
                {
                    temp=temp.next;
                }
                temp.previous.next=temp.next;
                temp.next.previous=temp.previous;
            }
            size--;
        }
    }

    /**
     * 取得第index个元素
     * @param index
     * @return
     */
    public E get(int index)
    {
        //索引越界
        if(index>=size || index<0)
        {
            throw new IndexOutOfBoundsException("Node.get():"+index);
        }
        else
        {
            //index>size/2,反向遍历
            if(index>size>>1)
            {
                Node<E> temp=this;
                for(int i=size;i>index;i--)
                {
                    temp=temp.previous;
                }
                return temp.element;
            }
            else
            {
                Node<E> temp=this;
                for(int i=0;i<=index;i++)
                {
                    temp=temp.next;
                }
                return temp.element;
            }
        }
    }
    public int size()
    {
        return size;
    }
    
    public static void main(String a[])
    {
        Node node=new Node();
        node.addAfter("1");
        node.addAfter("2");
        node.addAfter("3");
        node.addBefor("0");
        node.add("7", 0);
        System.out.println(node.get(0) );
        System.out.println(node.get(1) );
        System.out.println(node.get(2) );
        System.out.println(node.get(3) );
        System.out.println(node.get(4) );
        
    }
}
分享到:
评论

相关推荐

    用Java实现模拟双向循环链表LinkedList

    这是自己写的一个Java实现模拟数据结构中的LinkedList。实现其简单的添加节点功能

    LinkedList:该项目提供了单向、双向和循环链表的示例

    链表该项目提供了单向、双向和循环链表的示例

    C#双向链表LinkedList排序实现方法

    本文实例讲述了C#双向链表LinkedList排序实现方法。分享给大家供大家参考。具体如下: 1.函数 打印链表函数PrintLinkedList 和 排序函数SortLinkedList 注:下面代码中的链表每项都是double类型,如果换做其他的类型...

    VC++常用的数据结构类源码

    dnode.h: 双向循环链表结点 treenode.h: 二叉树结点 avltreenode.h: AVL 树结点 array.h: 安全数组,可自动增长大小(随机访问,但扩充时效率低) linkedlist.h: 普通链表(可随机访问,但访问效率低) ...

    Java超详细!Java实现数据结构PPT课件

    循环链表 静态链表 栈(Stack) 队列(Queue) 双端队列(Deque) 循环队列 哈希表(HashTable) 树形数据结构 二叉树(BinaryTree)、二叉搜索树(BinarySearchTree、BST) 平衡二叉搜索树...

    [详细完整版]链表数据结构.pdf

    在访问链表的时候,需要从起点开始迭代链表,直到找到指定元素位置 双向链表 每个元素都有指向下⼀个和上⼀个元素的链, 循环链表 结构包含了链表和双向链表 循环链表和链表之间的区别在于,最后⼀个元素指向下⼀个...

    【数据结构】Java 数据结构目录

    【循环链表CircleList】单向循环链表、双向循环链表以及约瑟夫环问题 【队列Queue】队列 Queue、双端队列 DeQueue、循环队列 CircleQueue、双端循环队列 CircleDeque 源码实现(Java) 【栈Stack】栈 Stack 源码 ...

    链表啊,数组 啊,哈希表啊

    安全数组,可自动增长大小(随机访问,但扩充时效率低) linkedlist.h: 普通链表(可随机访问,但访问效率低) dclinkedlist: 双向循环链表(不可随机访问,但插入、遍历的效率都比普通链表高) ...

    Java集合框架常见面试题.pdf

    剖析⾯试最常⻅问题之 Java 集合框架 集合概述 Java 集合概览 从下图可以看出,在 Java 中除了以 ...LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环) Set HashSet (⽆序,唯⼀): 基于 HashMap 实

    JAVA容器(每天学习一点点20191223)

    LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) List,Set,Map三者的区别 List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的...

    几个 C++ 的数据结构类

    安全数组,可自动增长大小;普通链表;双向循环链表;哈希表.......

    java集合详解与总结

    List: 有顺序的,元素可以重复 ...LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高 Vector: 底层用数组实现List接口的另一个类 特点:重量级,占据更多的系统开销 线程安全

    Java容器详解

    1.什么是容器在Java当中,有一个类专门用来存放其它类的...Arraylist:Object数组Vector:Object数组LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)2.Set一个不包含重复元素的collection。更确切地讲,

    收集一些VC 数据结构操作类代码集.rar

     dclinkedlist: 双向循环链表(不可随机访问,但插入、遍历的效率都比普通链表高)  hashtable.h:哈希表(使用键值标识元素,键值一样的元素即认为相等,需重载 == 运算符并由用户定义哈希函数)  binstree.h...

    VC++常用的数据结构类

     dclinkedlist: 双向循环链表(不可随机访问,但插入、遍历的效率都比普通链表高)  hashtable.h: 哈希表(使用键值标识元素,键值一样的元素即认为相等,需重载 == 运算符并由用户定义哈希函数)  binstree.h...

    leetcode中文官网链接-java-data-structure:用java实现数据结构,形成文档以及代码

    实现单向链表、循环链表和双向链表 栈的基本概念 && 实现栈的基本操作(顺序栈和链式栈) 队列的基本概念 && 实现队列的基本操作(顺序队列、链式队列和循环队列) 阅读jdk源码 LinkedList ArrayList 刷题:剑指...

    《数据结构 1800题》

    双向链表 11.在下面的程序段中,对 x的赋值语句的频度为(C )【北京工商大学 2001 一、10(3分)】 FOR i:=1 TO n DO FOR j:=1 TO n DO x:=x+1; A. O(2n) B.O(n) C.O(n2) D.O(log2n) 12.程序段 ...

    JavaSourceCodeAnalysis:JDK二进制阅读笔记,包括Java常用集合类和Java常用和发工具(同步工具,线程安全集合,线程池)两个部分-java source code analysis

    LinkedList是基于串联实现的线性表(双向链表),没有最大容量限制。 LinkedList还实现了Deque接口,可以作为单向和双向实例。 堆栈继承自向量,提供基础的堆栈操作。其保障线程安全的手段是使用同步的包装所有函数...

    突破程序员基本功的16课.part2

    9.3.2 循环链表 9.3.3 双向链表 9.4 线性表的分析 9.4.1 线性表的实现分析 9.4.2 线性表的功能 9.5 小结 第10课 栈和队列 10.1 栈 10.1.1 栈的基本定义 10.1.2 栈的常用操作 10.1.3 栈的顺序存储结构及...

Global site tag (gtag.js) - Google Analytics