java单链表增删查改

单链表增删查改

//Sequence.java
public interface Sequence {
    /**
     * 向线性表中添加元素
     * @param data 要存储的元素
     */
    void add(Object data);

    /**
     * 线性表中删除元素
     * @param index 要删除的元素下标
     * @return 是否删除成功
     */
    boolean remove(int index);

    /**
     * 在线性表中查找指定索引的元素
     * @param index 要查找的索引
     * @return
     */
    Object get(int index);

    /**
     * 判断线性表中是否有指定元素
     * @param data 要查找的元素内容
     * @return
     */
    boolean contains(Object data);

    /**
     * 修改线性表中指定索引的内容
     * @param index 要修改的元素下标
     * @param newData 修改后的内容
     * @return
     */
    Object set(int index,Object newData);

    /**
     * 返回当前线性表元素个数
     * @return
     */
    int size();

    /**
     * 直接清空线性表内容
     */
    void clear();

    /**
     * 将线性表转为数组
     * @return
     */
    Object[] toArray();
}

//LinkedList.java
public class LinkedList implements Sequence {
    private ListNode head;
    private int size;
    class ListNode{
        ListNode next;
        Object val;
        public ListNode(ListNode next,Object val){
            this.next=next;
            this.val=val;
        }
        public ListNode(Object data){
            this.val=data;
        }
    }
    @Override
    public void add(Object data) {//增
        ListNode node=new ListNode(head,data);
        head=node;//头插法只知道头指针
        size++;
    }

    @Override
    public boolean remove(int index) {//删除
        if(head==null){
            return false;
        }
        rangeCheck(index);//判断下标是否合法
        ListNode dummyHead=new ListNode(-1);//设立虚拟头节点,使操作统一(所有节点均有前驱结点)
        dummyHead.next=head;
        ListNode prev=dummyHead;//为了找到前驱节点
        for(int i=0;i<index;i++){
            prev=prev.next;
        }
        ListNode node=node(index);//找到指定下标节点
        prev.next=node.next;//前驱节点指向后继节点
        size--;
        return true;
    }

    @Override
    public Object get(int index) {//找到指定下标节点
        rangeCheck(index);
        return node(index).val;
    }

    @Override
    public boolean contains(Object data) {//查 查找链表中是否存在指定元素
        for(ListNode temp=head;temp!=null;temp=temp.next){
            if(temp.val==data){
                return true;
            }
        }
        return false;
    }

    @Override
    public Object set(int index, Object newData) {//改 修改指定下标节点数据
        rangeCheck(index);
        Object oldData=node(index).val;
        node(index).val=newData;
        return oldData;
    }

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

    @Override
    public void clear() {//清空
        for(ListNode temp=head;temp!=null;temp=temp.next){
            if(head.next!=null){
                head=head.next;
                head.val=null;
            }else{
                head.val=null;
            }
            size--;
        }
    }

    @Override
    public Object[] toArray() {
        Object[] data=new Object[size];
        int i=0;
        for(ListNode temp=head;temp!=null;temp=temp.next){
            data[i++]=temp.val;
        }
        return data;
    }
    public void display(){//打印
        for(ListNode temp=head;temp!=null;temp=temp.next){
            System.out.print(temp.val+" ");
        }
    }
    private void rangeCheck(int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("下标越界异常");
        }
    }
    private ListNode node(int index){//找到指定下标节点
        ListNode prev=head;
        for(int i=0;i<index;i++){
            prev=prev.next;
        }
        return prev;
    }
}

//Test.java
public class Test {
    public static void main(String[] args) {
        LinkedList linkedList=new LinkedList();
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        linkedList.add(4);
        linkedList.display();
        System.out.println();
        System.out.println(linkedList.get(2));
        linkedList.set(2,888);
        System.out.println(linkedList.get(2));
        System.out.println(linkedList.contains(4));
        System.out.println(linkedList.contains(999));
        linkedList.remove(1);
        System.out.println(linkedList.size());
        linkedList.display();
        System.out.println();
        linkedList.clear();
        System.out.println(linkedList.size());
    }
}

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42617262/article/details/88373237