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



我在循环链表的删除方法时遇到问题。它只执行 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 中都有一些值。所以你应该把这个变量用作类变量:

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

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

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

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

你的 remove() 逻辑不清楚。

如果你在 first

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

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

currNode= first  //currNode = null

所以 else 块将如下所示

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

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

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

相关内容

  • 没有找到相关文章

最新更新