单链表数据增删改查

定义一个接口:

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

定义单链表元素属性:

public class ListNode {
    private Object data;//真实的元素数据
    private ListNode next;//元素的后继(即指的是当前元素指向后一个元素)
    
    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 class SingleLinkedList implements MyArrayList{
    private ListNode first;
    private ListNode last;
    private int size;
    
    @Override
    public void add(Object element) {
        if(first==null) {
            first = new ListNode(element);
            last = first;
        }else {
            last.setNext(new ListNode(element)) ;
            last = last.getNext();
        }
        size++;
    }

    @Override
    public void delete(Object element) {
         ListNode p = first;//把头节点复制一下
         ListNode pre = null;//记录上一个的节点
         while(p != null) {
             if(p.getData().equals(element)) {
                 if (p==first) 
                     first=first.getNext();
                else
                 pre.setNext(p.getNext());
                 size--;
                 break;//注意
             }
             
             pre = p; //一个一个节点往后移动
             p=p.getNext();
         }
        
    }

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

    @Override
    public void update(int index, Object newElment) {
        int i=0;
        ListNode p = first;
        ListNode pre = null;
        
        while (p != null) {
            if (i==index) {
                p.setData(newElment);
            }
            pre = p;
            p = p.getNext();
            i++;
        }
        
    }

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

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

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

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

单元测试类:

class SingleLinkedListTest {
    SingleLinkedList list = new SingleLinkedList();
    

    
    @BeforeEach
//    @Test
    void testAdd() {
        
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        System.out.println(list);
        list.add("g");
        list.add("h");
        list.add("i");
        System.out.println(list);
    }

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

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

    @Test
    void testUpdate() {
        list.update(0, "x");
        System.out.println("4");
        System.out.println(list);
    }

    @Test
    void testContains() {
        boolean test = list.contains("g");
        System.out.println("5");
        System.out.println(test);
    }
//
    @Test
    void testAt() {
        System.out.println("6");
        System.out.println(list.at(7));
    }

    @Test
    void testIndexof() {
        System.out.println("7");
        System.out.println(list.indexof("g"));
        
    }

}

 

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