双链表实现增删改查

定义一个接口:

public interface MyList<T> extends Iterator<T>{
    /*新增一个元素*/
    void add(T element);
    
    /*删除相同元素*/
    void delete(T element);
    
    /*根据索引删除元素*/
    void delete(int index);
    
    /*
     * 将指定索引位置的元素替换成新元素
     */
    void update(int index,T newElment);
    
    /*
     * 当前列表中是否含有target这个元素
     */
    boolean contains(T target);
    
    /*
     * 返回指定索引处的元素
     */
    Object at(int index); 
    
    /*
     * 根据元素查找对应索引
     */
    int indexof(T element);
}

定义双链表元素属性:

public class ListNode {
    private Object data;//真实元素数据
    private ListNode next;//元素后继
    private ListNode pre;//元素前继
    
    public ListNode(Object data) {
        super();
        this.data = data;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public ListNode getNext() {
        return next;
    }

    public void setNext(ListNode next) {
        this.next = next;
    }

    public ListNode getPre() {
        return pre;
    }

    public void setPre(ListNode pre) {
        this.pre = pre;
    }
    
    
}

双链表实现类:

public class DoubleLinkList<T> implements MyList<T>{
    private ListNode first = new ListNode(null);
    private ListNode last = new ListNode(null);
    private int size;
    
    public DoubleLinkList() {
        first.setNext(last);
        last.setPre(first);
    }
    
    @Override
    public void add(T element) {
        ListNode newnode = new ListNode(element);
        last.getPre().setNext(newnode);
        newnode.setNext(last); 
        newnode.setPre(last.getPre());
        last.setPre(newnode);
        size++;
    }

    @Override
    public void delete(T element) {
         ListNode p = first.getNext();
         while(p != last) {
             if(p.getData().equals(element)) {
                    p.getPre().setNext(p.getNext());
                    p.getNext().setPre(p.getPre());
                    
                    p.setNext(null);
                    p.setPre(null);
                    size--;
                     break;//注意
                 }
             p=p.getNext();
         }
        
    }

    /*
     * 根据索引删除元素
     */
    @Override
    public void delete(int index) {
        if (index<0||index>=size) {
            return;
        }
        int i=0;//指针指向的节点的索引
        ListNode p = first.getNext();
        
        while (p != last) {
            if (i==index) {
                
                p.getPre().setNext(p.getNext());
                p.getNext().setPre(p.getPre());
                
                p.setNext(null);
                p.setPre(null);
                size--;
                break;//注意这里
            }
            p = p.getNext();
            i++;
        }
    }

    @Override
    public void update(int index, T newElment) {
        int i=0;
        ListNode p = first.getNext();

        
        while (p != last) {
            if (i==index) {
                p.setData(newElment);
            }
            p = p.getNext();
            i++;
        }
        
    }

    @Override
    public boolean contains(T target) {
        int i = 0;
        ListNode p = first.getNext();
        
        while (p != last) {
            if (p.getData().equals(target)) {
                return true;
            }
            p = p.getNext();
            i++;
        }
        return false;
    }

    @Override
    public T at(int index) { 
        if (index<0||index>=size) {
            return null;
        }
        int i=0;
        ListNode p = first.getNext();
        
        while (p != last) {
            if (i==index) {
                return (T) p.getData();
            }
            p = p.getNext();
            i++;
        }
        return null;
    }

    @Override
    public int indexof(T element) {
        int i=0;
        ListNode p = first.getNext();
        
        while (p != last) {
            if (p.getData().equals(element)) {
                return i;
            }
            p = p.getNext();
            i++;
        }
        return -1;
    }

    public String toString() {
        StringBuilder sBuilder = new StringBuilder("[");
        ListNode p = first.getNext(); 
        while(p != last) {
            sBuilder.append(p.getData());
            if (p.getNext() != last) 
                sBuilder.append(",");
                p = p.getNext();
        }
        sBuilder.append("]");
        return sBuilder.toString();
        
    }

    private ListNode now = first;
    
    @Override
    public boolean hasNext() {
        
        return now.getNext()!=last;
    }

    @Override
    public T next() {
        ListNode next = now.getNext();
        now = now.getNext();
        return (T)next.getData();
    }
}

单元测试类:

class DoubleLinkListTest {

    DoubleLinkList list = new DoubleLinkList();
    
    @BeforeEach
    void setUp() throws Exception {

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
    }

//    @Test
//    void testDoubleLinkList() {
//        
//    }

    @Test
    void testAdd() {
        System.out.println("add");
        System.out.println(list);
    }

    @Test
    void testDeleteObject() {
        list.delete("b");
        System.out.println("deleteobject");
        System.out.println(list);
    
    }

    @Test
    void testDeleteInt() {
        System.out.println("deleteindex");
        list.delete(0);
        System.out.println(list);
    }

    @Test
    void testUpdate() {
        System.out.println("update");
        list.update(1, "a");
        System.out.println(list);
    }

    @Test
    void testContains() {
        System.out.println("Contains");
        Boolean i=list.contains("b");
        System.out.println(i);
    }

    @Test
    void testAt() {
        System.out.println("at");
        Object i=list.at(4);
        System.out.println(i);
    }

    @Test
    void testIndexof() {
        System.out.println("indexof");
        int i=list.indexof("f");
        System.out.println(i);
    }
    
    @Test
    void iter() {
        System.out.println("Iterator");
        while (list.hasNext()) {
            System.out.println(list.next());
            
        }
    }

}

 

posted @ 2021-03-10 12:03  别看我看路  阅读(64)  评论(0编辑  收藏  举报