算法:从链表中删除重复的元素

时间:2015-02-14 06:27:52

标签: algorithm linked-list

提供链接列表[未排序],删除连续的重复元素:

输入:

1 2 3 5 5 6 6 3 2 7

输出:

1 7

  • 在第一次迭代后3和3连续重复,第二次迭代后2和2变为连续重复

编程语言不是一个问题,java / c / c ++,任何事情都可以。 使用额外的内存不是首选,不需要在一次迭代中完成额外的堆栈或队列。

2 个答案:

答案 0 :(得分:0)

要在一次通过中执行此操作,您需要doubly linked list,即每个节点需要指向上一个下一个 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是代码的工作版本。