如果我们检查 head==null 为什么不在 Java 链表中检查 tail==null?

If we check head==null why don't we check tail==null in Java linkedlist?

我是 Java 的初学者,目前正在完成有关 DSA 的 Udemy 课程。我正在学习链表,并且正在研究分别向链表插入节点和从链表删除节点的方法。

根据目前所学,我知道我们使用条件 head==null 来检查链表是否为空。

如果条件 head==null 为真则 LinkedList 为空,否则不为空。

但是,我们不应该检查是否也 tail==null 因为尾部将始终引用 LinkedList 中的最后一个节点,即使在我们创建 head==null 之后?

这是我的代码:

public class SinglyLinkedList{
  public Node head;
  public Node tail;
  public int size;

//Create Linkedlist
  public Node createLL(int num){
    Node node=new Node();
    node.value=num;
    node.next=null;
    head=node;
    tail=node;

    size=1;
    return head;
  }
//Insert Node
  public void insertNode(int num,int location){
    Node node=new Node();
    node.value=num;
    
    if(head==null){//Used to check if linked list is empty or not?
      createLL(num);
      return;
    }

    else if(location==0){
      node.next=head;
      head=node;
    }

    else if(location>=size){
      node.next=null;
      tail.next=node;
      tail=node;
    }

    else{
      Node tempNode=head;
      int index=0;

      while(index<location-1){
        tempNode=tempNode.next;
        index++;
      }
     node.next=tempNode.next;
     tempNode.next=node;
    }
    size++;
  }
//Delete Node
  public void deleteNode(int location){
    if(head==null){//Used to check if linked list is empty or not?
      System.out.println("The linked list is not present");
      return;
    }

    else if(location==0){
      head=head.next;
      size--;
      if(size==0){
        tail=null;
      }
    }

    else if(location>=size){
      Node tempNode=head;
      for(int i=0;i<size-1;i++){
        tempNode=tempNode.next;
      }
      if(head==null){
        tail=null;
        size--;
        return;
      }
      tempNode.next=null;
      tail=tempNode;
      size--;
    }

    else{
      Node tempNode=head;
      int index=0;

      while(index<location-1){
        tempNode=tempNode.next;
        index++;
      }
      tempNode.next=tempNode.next.next;
      size--;
    }
  }
}

链表中的节点作为值和内存地址(对于下一个节点)对存在,正如您在上面的程序中实现的那样。对于最后一个节点,列表的末尾表示为 NULL。

我们检查头部是否为NULL,因为如果链表中下一个节点的内存地址为NULL,则意味着已到达链表末尾。链表的尾部将始终为 NULL,因为它代表列表的末尾,并且没有下一个节点指向。

空列表:

head -> null
tail -> null

单节点列表:

head -> node1
node1.next -> null
tail -> node1

多节点列表:

head -> node1
node1.next -> node2
node2.next -> null
tail -> node2

其中 -> 表示“引用指向”。因此,无需检查 head/tail 是否为空。如果其中任何一个为null,则表示该列表没有节点且为空。