我只是在练习我的数据结构,并尝试制作一种方法来从单向链表中删除重复项。这是我所拥有的:
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 值,但对我来说一切看起来都是正确的。我调试了它,它似乎正确删除了节点,但之后打印出链表时仍然出现重复节点。建议?
代码是从 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;
}
}
方法2 - 使用哈希集来帮助检测重复项,我个人更喜欢这种方法:
/* 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;
}
}
首先,我认为您选择将所有先前的内容保存在一个字符串中可能是一个坏主意。
例如,如果您向它提供了一个包含 {x,y, xy} 的列表。 第三项将被检测为重复项。 几种简单的替代方法。
将以前的值保存在某个集合/对于每个元素,请检查是否有其他任何内容是等效的。 对所有东西进行排序,然后检查人们的邻居。
你设置 cur = temp;在你的循环的顶部, 所以做 cur.next = temp.next;之后什么也不做。 不要在循环的顶部将 cur 设置为等于 temp,或者只是在循环之后更改它。
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