提供链接列表[未排序],删除连续的重复元素:
输入:
1 2 3 5 5 6 6 3 2 7
输出:
1 7
编程语言不是一个问题,java / c / c ++,任何事情都可以。 使用额外的内存不是首选,不需要在一次迭代中完成额外的堆栈或队列。
答案 0 :(得分:0)
要在一次通过中执行此操作,您需要doubly linked list,即每个节点需要指向上一个和下一个< em> nodes。
使用问题中的示例,当当前节点(由^表示)到达前5个时,
1 2 3 5 5 6 6 3 2 7
^
删除5&#39>,让当前节点指向3
1 2 3 6 6 3 2 7
^
3与下一个节点不匹配,因此在前进到下一个节点后,您会找到并删除重复的6个节点,并且再次让当前节点指向3
1 2 3 3 2 7
^
这次3匹配下一个节点,因此删除了3&#39>,让当前节点指向2
1 2 2 7
^
删除2&#39>并完成。总而言之,只要算法删除重复,当前节点就会从已删除的第一个节点中获取 previous 指针的值。 / p>
答案 1 :(得分:0)
你可以在一次传递中完成这个,在java中只有4个整数变量:
int current = integers.getFirst();//shows the current number we are reading from the list.
int past = current; //shows the last number we read.
int iterator = 0; //shows where we are.
int NumOfRemoveProcess = 0; //shows number of nodes we are currently removing.
while (integers.size() > iterator+1){
iterator++;
current = integers.get(iterator);//getting next value
if(past == current){ //checking if two(or more consecutive elements are duplicated)
NumOfRemoveProcess ++; //shows the number of duplication that we saw.
integers.remove(iterator); //remove the new duplicated number.
iterator --; //set iterator after remove.
}
else if(NumOfRemoveProcess>0){ //if we removed number in the previous turn.
iterator--; //remove the first duplicated number.
integers.remove(iterator);
iterator --; //set iterator
NumOfRemoveProcess = 0;
past = integers.get(iterator);
}
else
past = current;
}
整数是整数的链表。 Here是代码的工作版本。