Java 无法从链接列表中删除元素?

Java 无法从链接列表中删除元素?,java,data-structures,linked-list,traversal,singly-linked-list,Java,Data Structures,Linked List,Traversal,Singly Linked List,我只是在练习我的数据结构,并尝试创建一种方法来从单链表中删除重复项。这就是我所拥有的: void removeDup() { Node temp = head; Node cur = null; String s = ""; while(temp!=null) { cur = temp; if(!s.contains(

我只是在练习我的数据结构,并尝试创建一种方法来从单链表中删除重复项。这就是我所拥有的:

        void removeDup() {
            Node temp = head;
            Node cur = null;
            String s = "";

            while(temp!=null) {
                cur = temp;

                if(!s.contains(temp.data + "")) {
                    s += temp.data + "";
                }
                else {
                    cur.next = temp.next;
                }

                temp = temp.next;
            }
        }
执行此方法后打印链接列表不会显示任何更改。我相信这是因为我没有正确地将上一个链接链接到当前链接的.next值,但在我看来一切都是正确的。我调试了它,它似乎正确地删除了节点,但当我随后打印出链接列表时,重复节点仍然出现。建议?

代码复制自:

方法1-暴力,查找两个节点的所有对,查看它们是否具有相同的值,不确定调用System.gc()是否是一个好主意:

/* Function to remove duplicates from an 
   unsorted linked list */
void remove_duplicates() { 
    Node ptr1 = null, ptr2 = null, dup = null; 
    ptr1 = head; 

    /* Pick elements one by one */
    while (ptr1 != null && ptr1.next != null) { 
        ptr2 = ptr1; 

        /* Compare the picked element with rest 
            of the elements */
        while (ptr2.next != null) { 

            /* If duplicate then delete it */
            if (ptr1.data == ptr2.next.data) { 

                /* sequence of steps is important here */
                dup = ptr2.next; 
                ptr2.next = ptr2.next.next; 
                System.gc(); 
            } else /* This is tricky */ { 
                ptr2 = ptr2.next; 
            } 
        } 
        ptr1 = ptr1.next; 
    } 
}
方法2-使用hashset帮助检测重复,我个人更喜欢这种方法:

 /* Function to remove duplicates from a 
       unsorted linked list */
    static void removeDuplicate(node head)  
    { 
        // Hash to store seen values, changed a little to compile for Java 8
        HashSet<Integer> hs = new HashSet<Integer>(); 

        /* Pick elements one by one */
        node current = head; 
        node prev = null; 
        while (current != null)  
        { 
            int curval = current.val; 

             // If current value is seen before 
            if (hs.contains(curval)) { 
                prev.next = current.next; 
            } else { 
                hs.add(curval); 
                prev = current; 
            } 
            current = current.next; 
        } 

    } 
/*函数,用于从数据库中删除重复项
未排序链表*/
静态空洞移除副本(节点头)
{ 
//散列来存储所看到的值,对Java 8的编译做了一些修改
HashSet hs=新的HashSet();
/*逐个拾取元素*/
节点电流=头;
node prev=null;
while(当前!=null)
{ 
int curval=current.val;
//如果之前看到当前值
如果(hs.contains(curval)){
prev.next=当前.next;
}否则{
加上(曲线);
prev=当前值;
} 
当前=当前。下一步;
} 
} 

首先,我认为您选择将前面的所有内容保存在一个字符串中可能是个坏主意

例如,如果您向它提供一个带有{x,y,xy}的列表。第三项将被检测为重复项。 两种简单的替代方法。
在某个集合中保留以前的值/对于每个元素,检查其他值是否相等。 把所有东西分类,然后检查邻居

设置cur=temp;在循环的顶端, 这样做cur.next=temp.next;事后什么也不做。
不要在循环的顶部将cur设置为temp,或者在循环结束后更改它。

cur.next=temp.next
不会更改任何内容。使用例如Java 8:

newlinkedList(Arrays.asList(1,2,1,3)).stream().distinct().collect(Collectors.toList())

newlinkedhashset(newlinkedlist(Arrays.asList(1,2,1,3))


另请参见

我认为您需要两个循环来查找是否存在重复(对于两个节点的所有组合)…使用LinkedHasSet怎么样?我相信这是你的作业?我猜,变量s的输出是正确的,对吗?不,这不是我的作业,只是练习,和@mettleap yes字符串s打印出将cur=temp移动到add to hashset条件内所需的正确输出。哈希集是一种帮助结构,通过检查哈希集中是否已经存在该值来检测重复