删除链表中的连续相同项目

时间:2014-11-09 17:31:32

标签: java

所以我必须编写一个函数来删除具有连续相同项目的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();

        }

任何帮助将不胜感激。

3 个答案:

答案 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();
}