从链接列表中删除节点

时间:2016-10-05 02:29:09

标签: java linked-list

我正在尝试从链接列表中删除给定的节点。我不知道为什么我的代码不起作用。任何提示? 所以我有[11,21,31,41]并且他们要求我在这种情况下删除索引2处的节点31.到目前为止,我有这个:

public void delete (int k) {
    //[ 11 21 31 41 ].delete( 2 ): expected=[ 11 21 41 ]
    if (k < 0 || k >= N) throw new IllegalArgumentException ();

    for(Node x = first; x != null; x = x.next) {
        //deletes node
        if(x.item == k){
            x = x.next;
        }
        if(x.item <= k){
            x = x.next.next;
        }
    }


}

有人可以告诉我,为什么这不起作用?谢谢

4 个答案:

答案 0 :(得分:0)

您可以使用下一个k次移动节点。存储临时int和前一个节点。每次调用next()时减少临时int。一旦处于0(所需元素),通过将前一个节点的下一个指针设置为x的下一个指针来删除,然后将x设置为null

我认为在你的代码中你缺少设置指针的部分。

例如:

(1) -> (2) -> (3)

要删除(2),请设置(1).next = (3)(2) = null。这将得到:

(1) -> (3)

答案 1 :(得分:0)

这里有一些问题,我鼓励你进行一些println调试,以便在开发时更好地理解这些问题。

  1. 假设item字段是Node的值,您将节点的值与所述节点的索引进行比较(例如x.item == k)。

    < / LI>
  2. 您要遵循的一般逻辑是,“如果迭代器指向的节点是我列表中的下一个节点,请将next设置为next }“。

答案 2 :(得分:0)

在您的代码中,您将节点的值与您传递的索引进行比较。此比较将始终具有小于节点中的值的索引。此后,当您假设代码正确时,您不会更新节点。

下面的代码应该会给你结果。

public void delete (int k)
{
//[ 11 21 31 41 ].delete( 2 ): expected=[ 11 21 41 ]
if (k < 0 || k >= N) throw new IllegalArgumentException ();
int count = 0;//Assuming index starts from 0
Node prev;
for(Node x = first; x != null; x = x.next)
{
    //deletes node
    count++;
    if(count<k)
    {
        prev = x;
        continue;
    }
    else
    {
        prev.next = x.next;
        x.next = null;
        break;
    }

}
if(count>k || count<k)
{
    System.out.println("No element with index k");
}
}

答案 3 :(得分:0)

@vase说得对

  

假设item字段是Node的值,您需要进行比较   节点的值到所述节点的索引(例如x.item == k)。

可以解决此问题的一些示例代码

public void delete(int k){
   Node n = first;
   for(int i = 0; i < k-1; i++){ // this loop finds the node right before the 
   n=n.next;                    // index to use to delete the desired index.
}
   n.next = n.next.next; // delete command
}