所以我必须编写一个函数来删除具有连续相同项目的Node。喜欢:{1,1,1,2,3,3,4}成为:{1,2,3,4} 我写了下面的代码,不知道它有什么问题。它适用于前几个项目。
public void deleterepetitive()
{
Node itr = head;
Node itrfront=itr.getNext();
while(itr.getNext()!=null)
{
if(itr.getItem()==itrfront.getItem())
{
itr.setNext(itrfront.getNext());
}
itr = itr.getNext();
itrfront = itrfront.getNext();
}
任何帮助将不胜感激。
答案 0 :(得分:0)
有很多方法可以做到这一点。
我发现要么从底部踩到列表(从第N个项目开始并迭代回到零项目),要么将集合插入到Set集合中以强制相同值的崩溃也有效
欢呼声
答案 1 :(得分:0)
在while循环中将行itrfront = itrfront.getNext();
更改为itrfront = itr.getNext();
。我猜你的代码在第一次重复遗漏后就会中断。
如下所示更改if块:(我们需要检查新的下一个项目而不是跳过它。)
if(itr.getItem()==itrfront.getItem())
{
itrfront = itrfront.getnext();
itr.setNext(itrfront);
continue;
}
之前您的代码是
第一次迭代:
1 1 1 1 1 2 3 3 4
^ ^
ITR NExt
重复喜欢删除节点
第二次迭代:
1 1 1 1 2 3 3 4
^ ^
ITR NExt
答案 2 :(得分:0)
你没有正确地增加你的迭代器,你希望itrfront总是在itr前面,但它实际上在它之上: 让 itr 为:^, itrfront be:A, itr.getNext() be:n,这就是正在发生的事情:
n
1 1 1 2 2 2 2 3
^ A
n
1 1 1 2 2 2 2 3
^ A
n
1 *1* 1 2 2 2 2 3
^
A
n
1 *1* 1 2 2 2 2 3
^
A
n
1 *1* 1 2 2 2 2 3
^
A
其中* 1 *表示垃圾收集
你想要做的是这样的事情:
while(itr.getNext()!=null)
{
while(itr.getItem()==itrFront.getItem())
{
itrfront = itrfront.getNext();
}
itr.setNext(itrfront);
itr = itr.getNext();
itrfront = itr.getNext();
}