Head值设置为空,但仍显示Tail值

人气:226 发布:2023-01-03 标签: java data-structures linked-list singly-linked-list

问题描述

在Java链表中,如果head=空,则LinkedList为空。但是,当我设置HEAD=NULL并打印Tail的值时,将显示该值。为什么我们说head==NULL表示LinkedList为空?为什么在链表应该为空的情况下显示尾部值?我们是否也应该检查id(Tail==NULL)?

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

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

    size=1;
    return head;
  }

  public void insertNode(int num,int location){
    Node node=new Node();
    node.value=num;
    
    if(head==null){//Check
      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++;
  }

  public void traverse(){
    if(head==null){//Check
      System.out.println("The linked list is empty");
    }
    Node tempNode=head;
    for(int i=0;i<size;i++){
      System.out.print(tempNode.value);
      if(i!=size-1){
        System.out.print("->");
      }
      tempNode=tempNode.next;
    }
    System.out.println();
  }

  public void deleteNode(int location){
    if(head==null){//Check
      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--;
    }
  }

主类

class Main {
  public static void main(String[] args) {
    SinglyLinkedList sLL=new SinglyLinkedList();
    sLL.createLL(5);
    sLL.insertNode(15, 1);
    sLL.insertNode(20, 2);
    sLL.insertNode(39, 3);
    sLL.insertNode(45, 4);

    sLL.traverse();
    
    sLL.head=null;
    System.out.println(sLL.tail.value);
  }
}

输出: 5-15-20-39-45

45

推荐答案

head成为null只是意味着您无法再到达第一个Node。这还意味着您无法通过next引用访问整个链,因为您没有起点。 垃圾收集器被允许释放所有不能再到达的对象。在您的示例中,除tail节点外的所有节点,因为您仍在SinglyLinkedList中保留对它的引用。

所以实际上您有一种空的LinkedList,因为您不能再正确地访问它。但是您仍然保持tail节点的活动状态,因为您引用了它。正确的解决方案是将tail也设置为null,这样垃圾回收器也可以释放此节点。

23