为了账号安全,请及时绑定邮箱和手机立即绑定

无法从链表中删除元素?

无法从链表中删除元素?

qq_笑_17 2021-11-11 13:32:13
我只是在练习我的数据结构并尝试制作一种方法来从单向链表中删除重复项。这就是我所拥有的:        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 值,但在我看来一切都是正确的。我调试它,它似乎正确删除了节点,但是当我之后打印出链表时仍然出现重复的节点。建议?
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

代码是从https://www.geeksforgeeks.org/remove-duplicates-from-an-unsorted-linked-list/复制的:


方法 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; 

    } 

}

方法二——使用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; 

        } 


    } 


查看完整回答
反对 回复 2021-11-11
?
撒科打诨

TA贡献1934条经验 获得超2个赞

cur.next = temp.next不会改变任何东西。使用例如 Java 8:

new LinkedList<>(Arrays.asList(1,2,1,3)).stream().distinct().collect(Collectors.toList());

或者

new LinkedHashSet<>(new LinkedList<>(Arrays.asList(1,2,1,3)))

另见https://www.geeksforgeeks.org/remove-duplicates-from-an-unsorted-linked-list


查看完整回答
反对 回复 2021-11-11
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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

例如,如果你给它提供了一个带有 {x,y, xy} 的列表。第三个项目将被检测为重复。几个简单的替代方法。
将以前的值保存在某个集合中/为每个元素检查是否有其他等效项。排序一切,然后检查人们的邻居。

你设置 cur = temp; 在循环的顶部,因此执行 cur.next = temp.next; 之后什么也不做。不要在循环的顶部设置 cur 等于 temp 或者只是在之后更改它。


查看完整回答
反对 回复 2021-11-11
  • 3 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信