【问题标题】:Removing the first element in a circular linkedList删除循环链表中的第一个元素
【发布时间】:2016-01-17 12:28:13
【问题描述】:

我的循环链接列表的删除方法有问题。它只执行 if 语句。我究竟做错了什么?我该如何解决这个问题? 在循环链表中,您只需要跟踪指向最后一个元素的第一个元素

public void remove()
  {
    Node currNode = first;
    Node prevNode = null;
    if(first != null)
    {
      if(currNode.getNext() == first)
      {
        first = null;
      }
    }
    else
    {
      prevNode = currNode;
      currNode = currNode.getNext();
    } 
  }

class Node
 {
  private int data;
  private Node next;

  public Node(int data, Node next) {
    this.data = data;
    this.next = next;
  }

  public int getData() {
    return data;
  }

  public Node getNext() {
    return next;
  }

  public void setNext(Node next) {
    this.next = next;
  }
}

【问题讨论】:

  • 能否分享一下Node的结构,什么是'first'?
  • 以及列表在空和非空时的结构规则。
  • 第一个是第一个节点
  • 我怀疑else 子句属于嵌套的if,而不是外部的。
  • 是的,我昨天看到了。已经修复了

标签: java linked-list circular-list


【解决方案1】:
Node currNode = first;
Node prevNode = null;

是局部变量,所以在函数 remove() 之后,它们被删除了,而你没有存储这个值。每次调用 remove() 时,currNode 和 prevNode 都有一些价值。所以你应该使用这个变量作为类变量:

...
Node currNode = first;
Node prevNode = null;

public void remove()
  {
    if(first != null)
    {
      if(currNode.getNext() == first)
      {
        first = null;
      }
    }
    else
    {
      prevNode = currNode;
      currNode = currNode.getNext();
    } 
  }

或者你应该使用currNode.setNext(...) instead of currNode = ...

【讨论】:

    【解决方案2】:

    我将做出某些假设,因为我无法发表评论

    -您使用第一个节点访问循环链表,这意味着如果 first 不为空,则您的循环链表不为空

    -其次,仅当链表非空时才调用 remove() 函数,因此从我的第一个假设来看,您无法到达 else 块。

    您的 remove() 逻辑不清楚。

    如果您在 first!=null 或链表非空时调用 remove(),则您正在检查第二个节点是否相同,然后删除对 first(first=null) 的引用意味着您丢失了链表没有将第二个节点分配为新的第一个(节点)。在我看来,您似乎删除了整个链表,而不仅仅是第一个元素。

    现在如果你在一个空链表上调用 remove() 函数,即 first=null

    currNode= first  //currNode = null
    

    所以 else 块看起来像这样

     prevNode=null;
     currNode=null.getNext() //Null pointer Exception!!  
    

    最后我检查了循环链表,最后一个节点的下一个应该指向第一个节点而不是第一个指向最后一个节点。

    PS-如果我的任何假设是错误的,请发表评论而不是投反对票:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多