1. 程式人生 > >Java實現雙鏈表

Java實現雙鏈表

一、連結串列實現結構

一個介面ILink 一個linkImpl類實現介面 LinkImpl中封裝一個內部類Node來實現連結串列的掛載

1.介面

interface ILink{
    void add(Object data);
    boolean remove(Object data);
    int contains(Object data);
    void  clear (Object data);
    Object set(int index,Object newData);
    Object get(int index);
    int size();
    Object[] toArray();
    void printList();
}

2.LinkImpl類

class linkImpl implements ILink{
    private Node first;
    private Node last;
    int size = 0;
    private class Node{
        private Node prev;
        private Object data;
        private Node next;

        public  Node(Node prev,Object data,Node next){
            this.prev = prev;
            this.data = data;
            this.next = next;
        }
    }
    
    @Override
    public void clear(Object data){ }

    @Override
    public void add(Object data) { }

    @Override
    public boolean remove(Object data) { }

    @Override
    public int contains(Object data) {  }

    @Override
    public Object set(int index, Object newData) { }

    @Override
    public Object get(int index) { }

    @Override
    public int size() {  }

    @Override
    public Object[] toArray() { }

    @Override
    public void printList() { }
}

二、方法實現

1.新增節點

public void add(Object data) {
        Node temp = this.last;
        Node newNode = new Node(temp, data, null);
        this.last = newNode;
        if (this.first == null) {
            this.first = newNode;
        }
        else {
            temp.next = newNode;
        }
        this.size++;
    }

2.刪除指定節點

public boolean remove(Object data) {
        if(data == null){
            for(Node temp = this.first;temp!= null;temp = temp.next){
                if(temp.data == null){
                    //刪除
                    unLink(temp);
                    return true;
                }
            }
        }else{
            for(Node temp = this.first;temp!=null;temp=temp.next){
                if(data.equals(temp.data)){
                    //刪除
                    unLink(temp);
                    return true;
                }
            }
        }
        return false;
    }
    
      //返回刪之前的物件
     private Object unLink(Node x){
        Object elementData = x.data;
        Node prev = x.prev;
        Node next = x.next;
        if(prev == null){
            this.first = next;
        }else{
            prev.next = next;
            x.prev = null;
        }
        if(next == null){
            this.last = prev;
        }else{
            next.prev = prev;
            x.next = null;
        }
        x.data = null;
        this.size--;
        return elementData;
    }

3.清空連結串列

 public void clear(Object data){
        for(Node x = this.first;x!= null;){
            Node temp = x.next;
            x.prev = x.next = null;
            x = temp;
        }
        this.first = this.last = null;
        size = 0;
    }

4.判斷一個物件是否存在於該連結串列

 public int contains(Object data) {
        if(data == null){
            int index = 0;
            for(Node x = this.first;x.data != null;x = x.next){
                if(x.data == null){
                    return index;
                }
                index ++;
            }
            return -1;
        }
        else{
            int index = 0;
            for(Node x = this.first;x.data != null;x=x.next){
                if(data.equals(x.data)){
                    return index;
                }
                index++;
            }
            return -1;
        }
    }

5. set和get方法

 public Object set(int index, Object newData) {
        if(!isLinkElement(index)){
            return null;
        }
        Node node = node(index);
        node.data = newData;
        return node;
    }
public Object get(int index) {
        if(!isLinkElement(index)){
            return null;
        }
        return node(index).data;
    }

輔助方法

    private Node node(int index){
        if(index<(size>>1)){
            Node result = this.first;
            for(int i = 0;i<index;i++){
                result = result.next;
            }
            return result;
        }
        Node result = this.last;
        for(int i = size-1; i>index;i--){
            result = result.prev;
        }
        return result;
    }



    private boolean isLinkElement(int index){
        return (index >=0) && (index<this.size);
    }

6.求連結串列長度

 public int size() {
        return this.size;
    }

7.將連結串列轉為物件陣列

 public Object[] toArray() {
        Object[] result = new Object[size];
        int i = 0;
        for(Node temp = this.first;temp!=null;temp = temp.next){
            result[i++] = temp.data;
        }
        return result;
    }

8.列印連結串列

 public void printList() {
        Object[] result = this.toArray();
        for(Object obj:result){
            System.out.println(obj);
        }
    }