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

Removing the first element in a circular linkedList

我在使用循环链表的删除方法时遇到问题。它只执行 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 currNode = first;
Node prevNode = null;

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

...
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 = ...

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

-你使用first节点访问循环链表,也就是说如果first不为null你的循环链表不为空

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

你的 remove() 逻辑不清晰。

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

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

currNode= first  //currNode = null

所以 else 块看起来像这样

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

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

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