用java实现单链表并实现CRUD

单链表有两个关键变量:存储的元素(object)以及指向下一个节点的引用(next)

public class Node{
    // 保存的元素
    public Object data;
    // 指向下一个节点
    public Node next;

    public Node() {
        this(null);
    }

    public Node(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Node{" +
                "data=" + data +
                '}';
    }
}
  • 通过画图展示链表的插入处理

  • 链表的删除处理:

代码实现:

public class MyLink {
    // 初始化一个头结点
    private Node head;
    // 链表的大小
    private int size;

    public int getSize() {
        return size;
    }

    // 头插法添加元素
    public void addHead(Object data){
        Node node = new Node(data);
        if(head == null){
            head = node;
            size ++;
            return;
        }
        // 新建的节点指向头结点
        node.next = head;
        // 然后再将新的节点变为头结点
        head = node;
        size ++;
     }
     // 尾插法添加元素
    public void addTail(Object data){
        Node node = new Node(data);
        if(head == null){
            head = node;
            size ++;
            return;
        }
        // 获取尾结点
        Node tail = head;
        while(tail.next != null){
            tail = tail.next;
        }
        // 将尾节点的引用指向新的节点
        tail.next = node;
        size ++;
    }
    // 展示链表的数据
    public void showData(){
        Node temp = head;
        while (true){
            System.out.print(temp.data+ " ");
            if(temp.next == null){
                return;
            }
            temp = temp.next;
        }
    }

    // 在链表中间插入元素
    public void addByIndex(int index,Object data){
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        if(index == 0){
            this.addHead(data);
            return;
        }
        if (index == size){
            this.addTail(data);
            return;
        }
        // 找到需要插入的节点的前节点和后节点
        Node newNode = new Node(data);
        // 找到需要插入的前节点
        Node node1 = head;
        for (int i = 0; i < index-1; i++) {
           node1 = node1.next;
        }
        // 进行插入操作(前节点的引用指向新的节点,新的节点的引用指向后节点)
//        Node node2 = node1.next; // node2表示前节点的后节点
//        node1.next = newNode; 前节点指向新的节点
//        newNode.next = node2; 新的节点直线前节点的后节点
        newNode.next = node1.next;
        node1.next = newNode;
        size++;
    }

    // 获取某个节点的元素
    public Object get(int index){
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        if(index == 0){
            return head.data;
        }
        if (index == size){
            Node temp = head;
            while(temp.next != null){
                temp = temp.next;
            }
            return temp.data;
        }
        Node node = head;
        for (int i = 0; i < index ; i++) {
            node = node.next;
        }
        return node.data;
    }

    // 删除某个节点的元素
    public void delete(int index){
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        if(index == 0){
            head = head.next;
            size --;
            return;
        }
        if(index == size){
            Node node = head;
            while (node.next.next != null){
                node = node.next;
            }
            node.next = null;
            size --;
            return;
        }
        // 找到待删除节点的前节点
        Node node = head;
        for (int i = 0; i < index-1; i++) {
            node = node.next;
        }
        node.next = node.next.next;
        size --;
    }

    public static void main(String[] args) {
        MyLink myLink = new MyLink();
        myLink.addTail("11111");
        myLink.addTail("22222");
        myLink.addTail("33333");
        myLink.addTail("44444");
        myLink.addTail("55555");
        myLink.addHead("66666");
        myLink.showData();
        System.out.println("链表大小:"+myLink.getSize());
        myLink.addByIndex(3,"ssdfsd");
        myLink.showData();
        System.out.println("链表大小:"+myLink.getSize());
        System.out.println("获取某一节点的元素:"+myLink.get(6));
        System.out.println("---------------删除节点----------------");
        myLink.delete(7);
        System.out.println("链表大小:"+myLink.getSize());
        myLink.showData();
    }

}

最终打印结果:

66666 11111 22222 33333 44444 55555 链表大小:6
66666 11111 22222 ssdfsd 33333 44444 55555 链表大小:7
获取某一节点的元素:55555
---------------删除节点----------------
链表大小:6

猜你喜欢

转载自blog.csdn.net/u013804636/article/details/107785885
今日推荐