单链表如何用java语言实现

如题,要完整的代码,包含最基本的链表是否为空,链表长度,在头或尾部添加元素,在头部移除元素(尾部不要求)

/**

  • 单链表实现

  • @author caasi

  • @since 2021-07-28 16:58:20

  • /
    public class SinglyLinkedList implements Cloneable{
    /**

    • 需要有的最基本的方法
    • size() 返回链表的长度
    • isEmpty() 判断链表是否为空
    • addFirst() 在链表头部添加元素
    • addLast() 在链表尾部添加元素
    • first() 返回链表的第一个元素,如果链表为空,则返回null
    • last() 返回链表的最后一个元素,如果链表为空,则返回null
    • removeFirst() 删除并返回链表的第一个元素,如果链表为空,则返回null
    • /

    /**

    • 节点内部类

    • @param

    • /
      private class Node{
      private E element;
      private Node next;
      public Node(E e, Node n){

        element = e;
        next = n;
      

      }

      public E getElement(){

        return element;
      

      }

      public Node getNext() {

        return next;
      

      }

      public void setNext(Node next) {

        this.next = next;
      

      }
      }

    //头节点
    private Node head;
    //尾节点
    private Node tail;
    //链表长度
    private int size;

    public int size(){

      return size;
    

    }

    public boolean isEmpty(){

      return size == 0;
    

    }

    public E first(){

      if(isEmpty()) return null;
      return head.getElement();
    

    }

    public E last(){

      if(isEmpty()) return null;
      return tail.getElement();
    

    }

    public E removeFirst(){

      if(isEmpty()) return null;
      E e = head.getElement();
      head = head.getNext();
      size -- ;
      if(isEmpty()) tail = null;
      return e;
    

    }

    public void addFirst(E e){

      head = new Node<>(e, head);
      if(isEmpty()) tail = head;
      size ++;
    

    }

    public void addLast(E e){

      Node<E> newNode = new Node<>(e, null);
      if(isEmpty()){
          head = newNode;
      } else {
          tail.setNext(newNode);
      }
      size ++;
      tail = newNode;
    

    }

    public void add(E e){

      addLast(e);
    

    }

    public void print(){

      if(isEmpty()) return;
      Node<E> node = head;
      while(node != null){
          System.out.println(node.getElement());
          node = node.getNext();
      }
    

    }

    @Override
    public boolean equals(Object obj) {

      if (obj == null) return false;
      if(getClass() != obj.getClass()) return false;
      SinglyLinkedList o = (SinglyLinkedList) obj;
      if(size != o.size) return false;
      Node walkA = head;
      Node walkB = o.head;
      while (walkA != null){
          if(!walkA.getElement().equals(walkB.getElement())){
              return false;
          }
          walkA = walkA.getNext();
          walkB = walkB.getNext();
      }
      return true;
    

    }

    @Override
    protected Object clone() throws CloneNotSupportedException {

      SinglyLinkedList other = (SinglyLinkedList) super.clone();
      if (size > 0){
          other.head = new Node<E>(head.getElement(), null);
          Node<E> walk = head.getNext();
          Node<E> otherTail = other.head;
          while (walk != null){
              Node<E> newest = new Node<>(walk.getElement(), null);
              otherTail.setNext(newest);
              otherTail = newest;
              walk = walk.getNext();
          }
      }
      return other;
    

    }
    }

链表是最基本的数据结构,例如以head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。