当前位置: 首页 > 知识库问答 >
问题:

Head值设置为null,但仍显示tail值

梁丘德寿
2023-03-14

在java链表中,如果head=null,则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-

45

共有2个答案

芮意
2023-03-14

通过该赋值,您使您的列表实例不一致。空列表将其headke成员设置为null并且其size等于0。

这就是为什么你不应该这样改变你班上的一个成员。您甚至应该将它们设置为私有,以防止调用方进行此类操作。如果希望有一种清空列表的方法,请为其创建一个适当的方法,该方法负责保持属性的一致性:

public void clear() {
    head = tail = null;
    size = 0;
}

在您的主代码中,只需调用sLL. Clear()方法。

如果您保留对节点的引用,您将始终能够访问它。要真正丢失一个节点,您必须删除对它的所有引用。

井疏珂
2023-03-14

为空只意味着您无法再到达第一个节点。这也意味着您无法通过next引用访问整个链,因为您没有起点
允许垃圾收集器“释放”所有无法访问的对象。在本例中,除了尾部节点之外的所有节点,因为您仍然在单链接列表中保留对它的引用。

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

 类似资料:
  • 问题内容: 我将每个列都设置为,但是由于某种原因,我仍然能够在每个列中添加一个值。这是我的表信息(创建语法): 这是一个有效的示例: 有什么想法为什么会这样? 问题答案: 您要插入空字符串,而空字符串不是,要检查错误,请执行以下操作: 你会看到错误。该只对那些不值检查。 为了防止空字符串,您必须使用触发器,或者在执行查询之前对服务器端编程语言进行检查以将空字符串转换为。的示例触发器可能类似于:(这

  • 当我执行命令检查活动的java版本时,它显示默认的(已经安装的open-jdk)java版本。如何用下载的open-jdk覆盖默认的open-jdk? 更新: 说/usr/bin/java

  • 我是Java初学者,目前正在完成有关DSA的Udemy课程。我正在学习链表,并且正在研究在链表中插入和删除节点的方法。 从我所学到的到目前为止,我知道我们使用条件来检查链接列表是否是空的。 如果条件为true,则LinkedList为空,否则它不为空。 然而,我们不应该检查是否,因为尾巴将始终引用LinkedList中的最后一个节点,即使我们使? 这是我的密码:

  • 问题内容: 我正在使用Linux Mint Cinnamon14。我将和环境变量设置如下: 然后,我做了适当的更改。 当我执行命令以检查活动的Java版本时,它将显示默认的Java版本(已安装open- jdk)。如何用我下载的默认文件覆盖默认的open-jdk? 更新: 说/ usr / bin / java 说“权限被拒绝” (然后要求输入密码)说找不到命令 但是,并表明它是正确的目录。 问题

  • 问题内容: 我希望将值设置为如果我提交的表单中的文本框未放入任何内容。我怎样才能做到这一点?我尝试插入,但这只是将单词添加到字段中。 我不确定应该为此提供什么代码,我只是在编写UPDATE查询。 问题答案: 不要在更新语句中加引号。这应该工作:

  • 问题内容: 我需要检查value是否定义为任何东西,包括null。将null值视为undefined并返回。以以下为例: 请注意,这是未定义的。 我需要找到满足以下条件的条件: 有任何想法吗? 问题答案: IIRC,您可以使用此功能: