3 回答
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;
}
}
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
TA贡献1825条经验 获得超4个赞
首先,我认为您选择将所有以前的东西保存在一个字符串中可能是一个坏主意。
例如,如果你给它提供了一个带有 {x,y, xy} 的列表。第三个项目将被检测为重复。几个简单的替代方法。
将以前的值保存在某个集合中/为每个元素检查是否有其他等效项。排序一切,然后检查人们的邻居。
你设置 cur = temp; 在循环的顶部,因此执行 cur.next = temp.next; 之后什么也不做。不要在循环的顶部设置 cur 等于 temp 或者只是在之后更改它。
添加回答
举报