删除单链表中第二次出现的节点

时间:2011-10-25 20:23:27

标签: c linked-list

这是一个面试问题,我试图解决它。 我完全解决了,我意识到我错过了一个测试用例。

问题是,如何删除链接列表中第二次出现的节点。 例如: 1-> 2-> 9-> 5-> 2且I进入2。 所以输出应该是1-> 9> 5-> 2

我确实使用了第一个和第二个指针来解决这个问题,这些指针将根据调查结果继续进行交换。 我总是存储前一个指针。例如,在上面的例子中,我存储在1和5.所以我总是可以删除下一个。

但是如果链接列表变成这样: 2→7-> 9-→2 并且out out必须是7-> 9-> 2。

如果你们有任何问题,请告诉我吗?

4 个答案:

答案 0 :(得分:1)

  • 从左到右迭代列表,假设是单链表。
  • 如果下一个节点是您要查找的节点,请使用临时指针指向它。
  • 让当前节点的下一个指针指向next-> next。
  • 删除临时指针指向的节点。

答案 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=  &current->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)