Java 删除循环链接列表中的第一个元素

Java 删除循环链接列表中的第一个元素,java,linked-list,circular-list,Java,Linked List,Circular List,我对循环链表的删除方法有问题。它只执行if语句。我做错了什么?如何解决此问题? 在循环链表中,您只需要跟踪指向最后一个元素的第一个元素 public void remove() { Node currNode = first; Node prevNode = null; if(first != null) { if(currNode.getNext() == first) { first = null; }

我对循环链表的删除方法有问题。它只执行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;
  }
}
是局部变量,因此在函数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(…)而不是currNode=…我会做出一些假设,因为我不能发表评论

-您可以使用第一个节点访问循环链接列表,这意味着如果第一个节点不为null,则循环链接列表不为空

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

您的remove()逻辑不清楚

如果第一次调用remove()=空或链表在非空中检查第二个节点是否与第一个节点相同,然后删除对第一个节点的引用(first=null),意味着在没有将第二个节点指定为新的第一个节点(node)的情况下丢失链表。在我看来,你删除了整个链表,而不仅仅是第一个元素

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

currNode= first  //currNode = null
所以else块看起来像这样

 prevNode=null;
 currNode=null.getNext() //Null pointer Exception!!  
上次我在循环链表中检查时,最后一个节点的下一个应该指向第一个节点,而不是第一个指向最后一个


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

能否请您分享节点的结构,以及“first”是什么?以及列表在空和非空时的结构规则。first是firstnode我怀疑
else
子句属于嵌套的
If
,不是外面的。是的,我昨天看到了。已经修好了
 prevNode=null;
 currNode=null.getNext() //Null pointer Exception!!