这是一个面试问题,我试图解决它。 我完全解决了,我意识到我错过了一个测试用例。
问题是,如何删除链接列表中第二次出现的节点。 例如: 1-> 2-> 9-> 5-> 2且I进入2。 所以输出应该是1-> 9> 5-> 2
我确实使用了第一个和第二个指针来解决这个问题,这些指针将根据调查结果继续进行交换。 我总是存储前一个指针。例如,在上面的例子中,我存储在1和5.所以我总是可以删除下一个。
但是如果链接列表变成这样: 2→7-> 9-→2 并且out out必须是7-> 9-> 2。
如果你们有任何问题,请告诉我吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
IMO避免简单链接列表中重复的最简单方法是将其排序。这样,您将在插入元素时检测到重复。
不知道这是否是您面试问题的可接受解决方案,因为它不会“删除事件”。
答案 2 :(得分:0)
假设这是一个用作队列的单个链表,其中开始指针指向队列中的最后一个元素,并且我们可以有两个以上相同元素的出现,那么我建议使用以下算法:
int removeSecondOccurrence( List_t **start, int target )
{
if( start == NULL || *start == NULL )
return -10;
List_t *current= *start,
**first = NULL,
**second = NULL;
if( ( *start )->data == target )
first= start;
while( current->next != NULL )
{
if( current->next->data == target )
{
if( first != NULL )
second= first;
first= ¤t->next;
}
current= current->next;
}
if( second != NULL )
{
List_t *tmp= ( *second )->next;
free( *second );
( *second )= tmp;
return 0;
}
return 1;
}
答案 3 :(得分:0)
我们可以使用Hashing heree,我们从头到尾遍历链接列表。对于每个新遇到的元素,我们检查它是否在哈希表中:如果是,我们将其删除;否则我们把它放在哈希表中 时间复杂度为:O(n)