1

“RemoveAll”类是 Linked List 类的一部分。我编写的类从链接列表中删除所有键,但不会删除重复键。

有人知道为什么吗?我如何也可以删除重复的键?

public class LinkedIntList {

    private ListNode front; 
    private String name = "front"; 

    // Constructs an empty list.
    public LinkedIntList() {
        front = null;
    }


   public void removeAll(int key){

    if(front == null){ 

         throw new RuntimeException();

       }else if( front.data == (key)) {

      front = front.next;

      return;
   }

     ListNode cur  = front;

     ListNode prev = null;

   while(cur != null  && cur.data != (key) ){

      prev = cur;

      cur = cur.next;
   }

   if(cur == null) 

    throw new RuntimeException();

   
   prev.next = cur.next;

}
4

4 回答 4

1

如果您有重复项,蛮力方法是继续调用 removeAll() 直到它返回 false。

while (myCollection.removeAll(someOthercollection))
   ;  // comment here that the loop does nothing for clarity

补充:正如@Dukeling 正确指出的那样,您不必这样做。但是,如果 removeALl() 实施不当,您可能不得不这样做。

于 2013-03-04T01:47:00.070 回答
1

好吧,您的方法只找到第一个匹配键,然后尝试从列表中删除该项目,然后返回。找到第一个匹配项后,您将不得不循环删除项目,直到找到匹配的键(或者您到达列表末尾)。

于 2013-03-04T01:50:46.693 回答
1
public void removeAll(T value) {
    if (this.front == null) {
        return;
    }

    Node<T> prevNode = null;
    Node<T> currNode = this.front;

    // If the node we want to remove is front node...
    while (currNode.data.equals(value)) {
        prevNode = currNode;
        currNode = currNode.next;
        prevNode.next = null;
    }
    this.front = currNode;

    while (currNode != null) {
        if (currNode.data.equals(value)) {
            prevNode.next = currNode.next;
            currNode.next = null;
        } else {
            prevNode = currNode;
        }
        currNode = prevNode.next;
    }
}
于 2018-04-02T18:09:51.457 回答
0

您需要在 data == 键时删除节点,以便确保删除所有事件,而不仅仅是第一个。

在这些行else if( front.data == (key)) { front = front.next;中,您只删除第一次出现。它应该是while ( front.data == (key)) { front = front.next;

再次在这里,您只删除一个节点: prev.next = cur.next 您需要一个while cur.data == key块来将prevandcur节点调整为匹配键的最后一次prev.next = cur.next;出现,然后再调用. 否则,您将只删除第一次出现。

于 2013-03-04T02:23:35.337 回答