2016-10-05 152 views
1

我试图从链接列表中删除给定的节点。我不知道为什么我的代码无法正常工作。任何提示? 所以我有[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; 
     } 
    } 


} 

谁能告诉我,请为什么这不工作?谢谢

+0

的就是你得到的错误?或者它只是不去除元素。 – denis

+0

它根本不会删除元素... – Hello

+1

您需要将您的前一个节点的下一个设置为要删除的节点的下一个(假设为单个链接列表) – Zarwan

回答

0

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

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

例如:

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

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

(1) -> (3) 
0

有一对夫妇的事情去错在这里,我鼓励你一些的println调试工作,为您开发,以更好地了解这些问题。

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

  2. ,你会想按照一般的逻辑是,“如果迭代器指向的节点是下一个节点在我的名单,设置我nextnext。”

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"); 
} 
} 
0

@vase是正确的说法

假设项目字段是节点的值,你比较 提到节点的节点来的指数值(egxitem == 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 
}