手書き双方向チェーンテーブルLinkedListのいくつかの一般的な機能

3791 ワード

実現する機能は以下の通りである:1)チェーンテーブルを作成する2)ノードを追加する(デフォルト追加と指定位置追加)3)あるノードにアクセスする4)ノードを削除する5)チェーンテーブルの長さの大きさを得る6)チェーンテーブルが空であるかどうかを判断する7)カスタムチェーンテーブルの印刷フォーマットをカスタマイズする8)チェーンテーブルを空にする
*注意:ノードの前進と後続を明らかにするには,削除時に付与の順序に注意する!!!
チェーンテーブルのノードのクラスノードの定義

public class Node {
    
    /**
     *  
     * 
     */
    Object value;
    
    /**
     *   
     */
    Node pre;
    
    /**
     *   
     */
    Node next;
    
    public Node(){
        
    }
    
    public Node(Object value, Node pre, Node next) {
        this.value = value;
        this.pre = pre;
        this.next = next;
    }
}
双方向チェーンテーブルLinkListを定義し、実現機能は以下の通りである.
/**
 *     
 * 
 * @author min
 *
 */
public class LinkList {

    /**
     *    
     */
    private Node head;
    
    /**
     *    
     */
    private Node tail;
    
    private int size;
    
    public LinkList() {
        head = new Node();
        tail = new Node();
        
        head.next = tail;
        tail.pre = head;
        size = 0;
        
    }
    
    public int size() {
        return size;
    }
    
    public boolean isEmpty() {
        return size==0;
    }
    
    public void clear() {
        head.next = tail;
        tail.pre = head;
        size = 0;
    }
    
    /**
     *          
     * 
     * @param value   
     */
    public void add(Object value) {
        Node node = new Node(value,tail.pre,tail);
        tail.pre.next = node;
        tail.pre = node;
        size ++;
        }
    
    /**
     *            
     * @param index
     * @param value
     */
    public void add(int index, Object value) {
        checkLinkList(index);
        
        if(index == size -1) {
            //      
            add(value);
        }
        else{
            Node x = node(index-1);
            Node y = node(index);
            Node node = new Node(value, x, y);
            x.next = node;
            y.pre = node;
            size ++;
        }        
    }
    
    /**
     *          
     * @param index
     * @return       
     */
    public Object get(int index) {
        //        
        checkLinkList(index);
        //    
        return node(index).value;
    }

    /**
     *        
     * @param index
     * @return       
     */
    public Node remove(int index) {
        checkLinkList(index);
        Node x = node(index);
        x.pre.next = x.next;
        x.next.pre = x.pre;
        size --;
        return x;
    }
    

    /**
     *           
     * 
     * @param index
     */
    private void checkLinkList(int index) {
        if(index > size() ||index < 0)
            throw new ArrayIndexOutOfBoundsException(index);
    }

    /**
     *            
     * 
     * @param index   
     * @return      
     */
    private Node node(int index) {
        // 1   
        Node firstNode = head;
        //  1   
        Node lastNode = tail;
        
        //      
        if(index <=(size>>1) ) {
            Node indexNode = firstNode;
            for(int i = -1; i < index; i++)
                indexNode = indexNode.next;
            return indexNode;
        }
            
        //    
        else{            
            Node indexNode = lastNode;
            for(int i = size; i>index; i--) {
                indexNode = indexNode.pre;
            }
            return indexNode;
        }        
    }
    
    /**
     *         
     * 
     */
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        String str = "";
        for(int i = 0; i
テスト
いくつかの一般的な機能しか実現されず、自分で書いたものとツールパッケージのクラスを比較すると、そこからgetが多くなります.利益が多い~