`
128kj
  • 浏览: 604103 次
  • 来自: ...
社区版块
存档分类
最新评论

双向链表(java实现)

阅读更多
代码来自教科书。
public class MyLinkedList<T> implements Iterable<T>
{
    private int theSize;
    private Node<T> begin;//头指针,哑的,第一个数据的前面
    private Node<T> end;//尾指针,哑的,最后一个数据的后面

    public MyLinkedList( )
    {
        clear( );
    }
    
   
    public void clear( )
    {
        begin = new Node<T>( null, null, null );
        end = new Node<T>( null, begin, null );
        begin.next = end;
        
        theSize = 0;
    }
    
   
    public int size( )
    {
        return theSize;
    }
    
    public boolean isEmpty( )
    {
        return size( ) == 0;
    }
  
    //在尾端添加一个
    public boolean add( T x )
    {
        add( size( ), x );   
        return true;         
    }
    
    //在索引idx处添加
    public void add( int idx, T x )
    {
        addBefore( getNode( idx, 0, size( ) ), x );
    }
    
   //在节点P之前加一个节点
    private void addBefore( Node<T> p, T x )
    {
        Node<T> newNode = new Node<T>( x, p.prev, p );
        newNode.prev.next = newNode;
        p.prev = newNode;         
        theSize++;
    }   
    
   //获取索此处节点数据
    public T get( int idx )
    {
        return getNode( idx ).data;
    }
        
    //将索引idx处节点的值更换为nuwVal
    public T set( int idx, T newVal )
    {
        Node<T> p = getNode( idx );
        T oldVal = p.data;
        
        p.data = newVal;   
        return oldVal;
    }
    
    //获取索引处的节点
    private Node<T> getNode( int idx )
    {
        return getNode( idx, 0, size( ) - 1 );
    }

    
    // //获取索引处的节点,索引限制在lower和upper之间
    private Node<T> getNode( int idx, int lower, int upper )
    {
        Node<T> p;
        
      if( idx < lower || idx > upper )
       throw new IndexOutOfBoundsException("getNode index: " + idx + "; size: " + size( ));
            
        if( idx < size( ) / 2 )
        {
            p = begin.next;
            for( int i = 0; i < idx; i++ )//从最前面开始往后遍历
                p = p.next;            
        }
        else
        {
            p = end;
            for( int i = size( ); i > idx; i-- )//从最后面开始往前遍历
                p = p.prev;
        } 
        
        return p;
    }
    
    //删除索引处的节点
    public T remove( int idx )
    {
        return remove( getNode( idx ) );
    }
    
   //删除节点p
    private T remove( Node<T> p )
    {
        p.next.prev = p.prev;
        p.prev.next = p.next;
        theSize--;
        
        return p.data;
    }
    
    
    public String toString( )
    {
        StringBuilder sb = new StringBuilder( "[ " );
        
        for( T x : this )
            sb.append( x + " " );
        sb.append( "]" );
    
        return new String( sb );
    }
   

    public java.util.Iterator<T> iterator( )
    {
        return new LinkedListIterator( );
    }


    private class LinkedListIterator implements java.util.Iterator<T>
    {
        private Node<T> current = begin.next;
        private boolean okToRemove = false;
        
        public boolean hasNext( )
        {
            return current != end;
        }
        
        public T next( )
        {
            if( !hasNext( ) )
                throw new java.util.NoSuchElementException( ); 
                   
            T nextItem = current.data;
            current = current.next;
            okToRemove = true;
            return nextItem;
        }
        
        public void remove( )
        {
            if( !okToRemove )
                throw new IllegalStateException( );
                
            MyLinkedList.this.remove( current.prev );
            okToRemove = false;       
        }
    }
    
   
    private static class Node<T>
    {
        public Node( T d, Node<T> p, Node<T> n )
        {
            data = d; prev = p; next = n;
        }
        
        public T data;
        public Node<T>   prev;
        public Node<T>   next;
    }
      
}


public class TestLinkedList
{
    public static void main( String [ ] args )
    {
        MyLinkedList<Integer> lst = new MyLinkedList<Integer>( );
        
        for( int i = 0; i < 10; i++ )
            lst.add( i );
        for( int i = 20; i < 30; i++ )
            lst.add( 0, i );
        
        lst.remove( 0 );
        lst.remove( lst.size( ) - 1 );
        
        System.out.println( lst );
        
        java.util.Iterator<Integer> itr = lst.iterator( );
        while( itr.hasNext( ) )
        {
            itr.next( );
            itr.remove( );
            System.out.println( lst );
        }
    }
}
运行结果:

[ 28 27 26 25 24 23 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 27 26 25 24 23 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 26 25 24 23 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 25 24 23 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 24 23 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 23 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 22 21 20 0 1 2 3 4 5 6 7 8 ]
[ 21 20 0 1 2 3 4 5 6 7 8 ]
[ 20 0 1 2 3 4 5 6 7 8 ]
[ 0 1 2 3 4 5 6 7 8 ]
[ 1 2 3 4 5 6 7 8 ]
[ 2 3 4 5 6 7 8 ]
[ 3 4 5 6 7 8 ]
[ 4 5 6 7 8 ]
[ 5 6 7 8 ]
[ 6 7 8 ]
[ 7 8 ]
[ 8 ]
[ ]


下载源码:
分享到:
评论

相关推荐

    单链表双向链表java实现

    对于单链表的Java实现,我们可以这样定义: ```java public class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } public class LinkedList { Node head;...

    JAVA实现链表_双向链表

    JAVA实现链表_双向链表

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    双端链表和双向链表Java代码

    本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...

    JAVA双向链表反转实现

    以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...

    Java实现双向链表

    用Java定义一个双向链表,实现链表的基本操作: 初始化、获取头结点、添加新元素、删除链表元素、 获取链表元素、查找链表元素、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空链表。

    Java双向链表的实现

    下面我们将详细讲解如何实现一个自定义的Java双向链表,并参考提供的`LinkNode.java`文件来理解其内部机制。 首先,我们需要定义一个表示链表节点的类`LinkNode`。这个类通常包含三个属性:存储数据的`data`字段、...

    Java有序非循环双向链表算法实例

    四、Java实现 在Java中,双向链表可以使用内置的`java.util.LinkedList`类实现,但要实现有序且非循环的特性,可能需要自定义链表节点类,并添加额外的排序逻辑。例如: ```java class Node { int data; Node ...

    Java算法实例-双向链表操作

    下面将详细介绍这些基本操作,并提供相应的Java实现。 1. **创建双向链表** 创建双向链表首先要定义链表节点类,包含数据域和两个指针域,分别指向前后节点。Java代码如下: ```java class Node { int data; ...

    用java实现双向链表操作

    用java实现双向链表的完整操作,主要用到内部类实现。

    基于双向链表的基数排序

    基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,需要将关键字...为了尽可能少的消耗复制时占用的空间,桶的数据结构选择链表,为了构造队列,选择使用双向列表。

    Java LinkedList 双向链表实现原理

    相信大家都明白 LinkedList 是基于双向链表而实现的,本篇文章主要讲解一下双向链表的实现,并且我们参考 LinkedList 自己实现一个单链表尝试一下。 什么是链表? 简单的来讲一下什么是链表:首先链表是一种线性的...

    2022年Java语言中链表和双向链表Java教程.docx

    《2022年Java语言中链表和双向链表Java教程》 链表作为一种基础且重要的数据结构,广泛应用于编程领域,特别是在Java语言中。虽然Java不直接提供指针,但通过对象引用,我们可以轻松地实现链表的构建。在Java中,...

    双向链表双向链表双向链表

    在Java中,`java.util.LinkedList`类也是基于双向链表实现的。这些高级语言的内置数据结构封装了底层的指针操作,使得开发者可以更专注于逻辑处理,而不是底层实现。 总的来说,双向链表是一种非常重要的数据结构,...

    Java实现双向链表(两个版本)

    主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下

    二叉树转换为双向链表

    二叉树转换为双向链表 通过随机创建二叉排序树测试二叉树转换为双向链表是否正确 http://blog.csdn.net/ssuchange/article/details/17383625

    在双向链表上实现快速排序的递归算法

    在双向链表上实现快速排序的递归算法 输入的形式:元素个数、元素都为整型。 输入值范围:元素个数为非负正整数,需要排序的元素都为整型。 输出的形式:排序前的元素序列和排序后的元素序列。 程序的功能:对用户...

    双向链表实现约瑟夫环

    已知N个人(以编号1,2,3...n分别表示)围成一个圈。 从编号为K的人开始报数,数到M的那个人出列,他的下一个人又从1开始报数,依照此规律重复下去,直到圆圈中的人全部出列。 问题:请打印出这N个的...双向链表实现的

Global site tag (gtag.js) - Google Analytics