我想从已排序的链接列表{0 1 2 2 3 3 4 5}中删除重复项。
`
public Node removeDuplicates(Node header)
{
Node tempHeader = null;
if(header != null)
tempHeader = header.next;
else return header;
Node prev = header;
if((tempHeader == null)) return header ;
while(tempHeader != null)
{
if(tempHeader.data != prev.data)
{
prev.setNext(tempHeader);
}
tempHeader = tempHeader.next;
}
prev = header;
printList(prev);
return tempHeader;
}
`
prev.setNext(tempHeader)在while循环中无法正常工作。理想情况下,当prev = 2且tempHeader = 3时,prev.next应该是data = 3的节点。
Printlist函数只接受标题指针并打印列表。
节点定义如下。
public class Node
{
int data;
Node next;
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
答案 0 :(得分:2)
循环已排序,因此您知道重复项将彼此相邻。如果你想编辑列表然后,你必须有两个列表指针(你这样做)。你称之为tempHeader和prev的那个,你必须在列表中将它们推进(我在代码中没有看到)。否则,如果你没有按照前进指针前进,那么你总是将tempHeader下的元素与列表中的第一个项目进行比较,这是不正确的。
然而,更简单的方法是随时建立一个新列表。只需记住您附加到列表中的最后一项的值。然后,如果你要插入的那个是相同的,那么就不要插入它,当你完成后,只需返回你的新列表。
答案 1 :(得分:1)
在这种情况下,不需要返回值。
public void removeDuplicates(Node list) {
while (list != null) {
// Walk to next unequal node:
Node current = list.next;
while (current != null && current.data.equals(list.data)) {
current = current.next;
}
// Skip the equal nodes:
list.next = current;
// Take the next unequal node:
list = current;
}
}
答案 2 :(得分:1)
public ListNode removeDuplicateElements(ListNode head) {
if (head == null || head.next == null) {
return null;
}
if (head.data.equals(head.next.data)) {
ListNode next_next = head.next.next;
head.next = null;
head.next = next_next;
removeDuplicateElements(head);
} else {
removeDuplicateElements(head.next);
}
return head;
}
答案 3 :(得分:0)
我可以就上述建议给你2条建议 1)将链接列表转换为Set,这将消除重复和 从Set返回到Linked列表 完成此操作的代码将是
linkedList = new LinkedList<anything>(new HashSet<anything>(origList));
2)如果你不想要任何重复,你可以使用LinkedHashSet
答案 4 :(得分:0)
通过DoublyLinked List并使用HashSet,
with recursive s as (
select s.id, s.name, s.timeint, count(*) as cnt,
row_number() over (partition by id order by timeint) as seqnum
from sample s
group by s.id, s.name, s.timeint
),
cte as (
select id, timeint, name, seqnum, timeint as start_timeint, cnt
from s
where seqnum = 1
union all
select s.id, s.timeint, s.name, s.seqnum,
(case when s.timeint <= cte.start_timeint + interval '1 second'
then cte.start_timeint else s.timeint
end),
s.cnt
from cte join
s
on s.id = cte.id and s.seqnum = cte.seqnum + 1
)
select id, name, start_timeint, sum(cnt)
from cte
group by id, name, start_timeint
order by id, start_timeint;
doublylinkedList
public static void deleteDups(Node n) {
HashSet<Integer> set = new HashSet<Integer>();
Node previous = null;
while (n != null) {
if (set.contains(n.data)) {
previous.next = n.next;
} else {
set.add(n.data);
previous = n;
}
n = n.next;
}
}