数据结构-双链表

来源:互联网 发布:伴奏提取软件 编辑:程序博客网 时间:2024/05/16 14:49

http://www.cnblogs.com/skywang12345/p/3561803.html






public class DoubleLink<T>{
    private DNode<T> mHead;
    private int mCount;
    
     class DNode<T>{
        private DNode prev;
        private DNode next;
        private T value;
        
        public DNode(T value,DNode prev,DNode next){
            this.value = value;
            this.prev = prev;
            this.next = next;
        }
    }
    
    public DoubleLink(){
        mHead = new DNode<T>(null, null, null);
        mHead.prev = mHead.next = mHead;
        mCount = 0;
    }
    
    public int size(){
        return mCount;
    }
    
    public boolean isEmpty(){
        
        return mCount == 0;
    }
    
    
    private DNode<T> getNode(int index){
        if(index < 0 || index >= mCount){
            throw new ArrayIndexOutOfBoundsException();
        }
        if(index <= mCount/2){
            DNode<T> node = mHead.next;
            for(int i = 0;i < index; i++){
                node = node.next;
            }
            System.out.println("t1:" +node.prev.value + " " + node.value+"  " + node.next.value);
            return node;
        }
        
        DNode<T> prveNode = mHead.prev;
        int  pIndex = mCount -index -1;
        for(int i= 0;i < pIndex;i++){
            prveNode = prveNode.prev;
        }
        System.out.println("t2:" +prveNode.prev.value + " " + prveNode.value+"  " + prveNode.next.value);
        return prveNode;
    }
    
    
    public DNode<T> get(int index){
        return getNode(index);
    }
    
    public T getFirst(){
        return getNode(0).value;
        
    }
    
    public T getLast(){
        if(isEmpty()){
            throw new ArrayIndexOutOfBoundsException();
        }
        return getNode(mCount-1).value;
    }
    
    /**
     * 在之前插入
     * @param index
     * @param value
     */
    public void insert(int index,T value){
        if(index == 0){
            DNode<T> dnt = new DNode<T>(value, mHead, mHead.next);
            mHead.next.prev = dnt;
            mHead.next = dnt;
            mCount++;
            return;
        }
        DNode<T> dnt= getNode(index);
        
        DNode<T> pDnt = new DNode<T>(value,dnt.prev,dnt);
        
        dnt.prev.next =pDnt;
        
        dnt.prev =pDnt;
        mCount++;
        return;
    }
    
    public void insertFirst(T value){
        insert(0, value);    }
    
    public void append(T value){
        if(isEmpty()){
            insertFirst(value);
        }else{
            DNode<T> lastNode = getNode(mCount -1);
            DNode<T> node = new DNode<T>(value,lastNode,lastNode.next);
            lastNode.next.prev = node;
            lastNode.next = node;
            mCount++;
            //lastNode.next.prev = node;
        }
        
    }
    
    public void del(int index){
        DNode<T> node = getNode(index);
        node.prev.next = node.next;
        node.next.prev = node.prev;
        node = null;
        mCount --;
        return;
    }
    
    public void delFirst(){
        del(0);
    }
    public void delLast(){
        del(mCount -1);
    }
    
    public static void main(String[] args) {
        DoubleLink<Integer> dlink = new DoubleLink<Integer>();
        
        dlink.insertFirst(30);
        dlink.insert(0,20);
        dlink.insert(0,10);
        dlink.insert(1, 15);
        
        dlink.insert(3, 25);
        dlink.append(40);
        dlink.append(50);
        
        dlink.del(1);
        
        for (int i=0; i<dlink.size(); i++){
            System.out.println("dlink("+i+")="+ dlink.get(i).value);
        }
    }
}


0 0