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

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

宇文迪
2023-03-14

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

从我所学到的到目前为止,我知道我们使用条件head==null来检查链接列表是否是空的。

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

然而,我们不应该检查是否尾巴==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--;
    }
  }
}

共有2个答案

滕翔飞
2023-03-14

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

我们检查head是否为NULL,因为如果链接列表中下一个节点的内存地址为NULL,则表示已到达列表的末尾。链接列表的尾部将始终为空,因为它将表示列表的结尾,并且不会有下一个要指向的节点。

裘臻
2023-03-14

空列表:

head -> null
tail -> null

单节点列表:

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

多节点列表:

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

其中<代码>-

 类似资料:
  • 我正在学习Java数据结构课程,目前正在学习单链表。在addHead的方法中,为什么我们需要检查tail==null?如果是真的,为什么尾巴=头? 完整代码:https://venus.cs.qc.cuny.edu/~ryba/cs313/linkedList/LinkedList.java

  • 问题内容: 在检查null时,我使用以下方法: 但我也看到了这一点: 使用一个相对于另一个有什么优势吗?还是只是为了提高可读性? 问题答案: 第二个版本()称为 yoda条件 。 它们都导致相同的行为,但是第二个优点是:当您忘记一个变量时,它可以防止您意外地更改变量。在这种情况下,编译器将在该行返回错误,并且您不会再遇到一些奇怪的代码行为和调试结果。

  • 为什么当我们试图创建一个单链表时,我们在类中使头为NULL,而不是使下一个头为NULL。在与链表相关的函数中,为什么要将下一个节点设为Null而不设为Null?

  • 让我澄清一下我的问题,OnCreate方法用于初始化视图并展平布局,因此我认为,如果OnCreate方法在一切之前运行,意味着我的EditText字段为空意味着为空,那么这个条件是如何工作的。但它运行良好,这意味着我理解错误。请告诉我我错过了什么。 代码片段取自google codelabs,我们在那里提供电话号码。在editText中,通过点击设备内置键盘上的发送按钮,我们启动电话应用程序来拨打

  • 问题内容: 我应该使用哪种构造来检查Twig模板中的值是否为NULL? 问题答案: 根据您的实际需求: 检查值是否为: {% endif %} 检查是否定义了变量: {% endif %} 另外,对两个值进行类型严格比较的测试可能对检查(如)以外的值很有用:

  • 问题内容: 我知道Google搜索可以找到合适的答案,但是我更喜欢听您的个人(也许是技术性的)意见。 Java和C#之间在引发异常方面有所不同的主要原因是什么? 在Java中,引发异常的方法的签名必须使用“ throws”关键字,而在C#中,您不知道在编译时是否可以引发异常。 问题答案: 因为对已检查异常的响应几乎总是: 如果您确实知道如果抛出特定异常,您可以执行某些操作,那么您可以捕获该异常,然