按链表的组织形式分有ArrayListLinkList两种。ArrayList内部其实是用数组的形式实现链表,比较适合链表大小确定或较少对链表进行增删操作的情况,同时对每个链表节点的访问时间都是constant;而LinkList内部以一个List实现链表,比较适合需要频繁对链表进行操作的情况,对链表节点的访问时间与链表长度有关O(N)
   另外,根据实现形式可以分为直接式(想不出什么合适的名字,姑且这样吧)和使用Iterator(迭代模式)两种方法。
               直接式的实现方法和C/C++中的写法差不多;
               而使用Iterator时,需要实现java.lan中的Iterable接口(或者也可以自己在链表内部定义自己的Iterator method将在下章博客中介绍:

直接式:

package com.ds.link;
public class DoubleLink <T>{
                            
    /**
     * Node<AnyType>类定义了双向链表中节点的结构,它是一个私有类,
     * 而其属性和构造函数都是公有的,这样,其父类可以直接访问其属性
     * 而外部类根本不知道Node类的存在。
     * @author ZHB
     *
     * @param <T> 类型
     * @param Data 是节点中的数据
     * @param pre  指向前一个Node节点
     * @param next 指向后一个Node节点
     */
    private class Node<T>{
        public Node<T> pre;
        public Node<T> next;
        public T data;
        public Node(T data,Node<T> pre,Node<T> next){
            this.data = data;
            this.pre = pre;
            this.next = next;
        }
        public Node(){
            this.data = null;
            this.pre = null;
            this.next = null;
        }
    }
                            
    // 下面是DoubleLinkedList类的数据成员和方法
    private int theSize;
    private Node<T> Header;
    private Node<T> Tail;
                            
    /*
     * 构造函数
     * 我们构造了一个带有头、尾节点的双向链表
     * 头节点的Next指向尾节点
     * 为节点的pre指向头节点
     * 链表长度起始为0。
     */
    public DoubleLink(){
                                
        theSize = 0;
        Header = new Node<T>(null,null,null);
        Tail = new Node<T>(null,Header,null);
                                
        Header.next = Tail;
    }
                            
    public void add(T item){
                                
        Node<T> aNode = new Node<T>(item,null,null);
                                
        Tail.pre.next = aNode;
        aNode.pre = Tail.pre;
        aNode.next = Tail;
        Tail.pre = aNode;
                                
        theSize++;
    }
                            
    public boolean isEmpty(){
        return (this.theSize == 0);
    }
                            
    public int size(){
        return this.theSize;
    }
                            
    public T getInt(int index){
                                
        if(index > this.theSize - 1 || index < 0)
            throw new IndexOutOfBoundsException();
                                
        Node<T> current = Header.next;
                                
        for(int i = 0;i < index;i++){
            current = current.next;
        }
                                
        return current.data;
    }
                            
    public void print(){
                                
        Node<T> current = Header.next;
                                
        while(current.next != null){
                                    
            System.out.println(current.data.toString());
                                    
            current = current.next;
        }
                                
    }
                            
    public static void main(String[] args){
        DoubleLink<String> dLink= new DoubleLink<String>();
                                
        dLink.add("zhb");
        dLink.add("zzb");
        dLink.add("zmy");
        dLink.add("zzj");
                                
        System.out.println("size : " + dLink.size());
        System.out.println("isEmpty? : " + dLink.isEmpty());
        System.out.println("3 : " + dLink.getInt(2));
        dLink.print();
    }
}

运行结果:


size : 4
isEmpty? : false
3 : zmy
zhb
zzb
zmy
zzj



有什么问题,我们随时沟通!