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

时间:2016-01-17 12:28:13

标签: java linked-list circular-list

我在使用循环链接列表的删除方法时遇到问题。它只执行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;
  }
}

2 个答案:

答案 0 :(得分:2)

^1 .*$ 

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

Node currNode = first;
Node prevNode = null;

或者你应该使用... Node currNode = first; Node prevNode = null; public void remove() { if(first != null) { if(currNode.getNext() == first) { first = null; } } else { prevNode = currNode; currNode = currNode.getNext(); } }

答案 1 :(得分:0)

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

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

- 只有当链表非空时才调用remove()函数,所以从我的第一个假设开始你就无法到达else块。

你的remove()逻辑不清楚。

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

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

currNode= first  //currNode = null

所以else块看起来像这样

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

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

PS-如果我的任何假设是错误的,请评论而不是downvoting:)