【问题标题】:Removal of items with duplicate data删除具有重复数据的项目
【发布时间】:2010-10-22 13:41:18
【问题描述】:

我正在编写一个函数来删除具有重复数据的连续项目。 例如 比如传入列表

->a->b->c->c->a->b->b->b->a->null

应该会导致

->a->b->c->a->b->a->null

列表项定义和函数声明如下

struct litem { 
char data; 
litem* next; 
}; 

Mo 代码看起来像

int remove_dumplicates(litem *&list)
{
 int count = 0; 
 struct litem * current = NULL;
 current = list;
 struct  litem *deleteNode;
 if (current == NULL ) return;
 while(current->next != NULL)
 {
  if ( current->data == current->next->data) // check for the duplicates 
   {
    count++;
    deleteNode =current->next;
    current>next= current->next->next;
    delete deleteNode;
   }      
  return (count);  
 }
}

这是实现预期结果的正确方法吗?

【问题讨论】:

  • 请先正确格式化您的代码。
  • return 语句可能在while 循环之外。而且,那里需要像 current = current->next; 这样的声明。
  • 您是否测试过常见和边缘案例?

标签: c data-structures linked-list singly-linked-list


【解决方案1】:

我没有看到 current 被增加到 current->next

以包含所有独特元素a -> b -> c 的列表为例,看看您的程序是如何工作的。

要解决此问题,您需要:

while(current->next != NULL) {
   if ( current->data == current->next->data) {
     // delete duplicates .
   } else {
     current = current -> next;
   }
}// end-while
return (count);

【讨论】:

  • 为什么current = current->next;else 内部而不是无条件的?
  • @Arun:重复项在if而不是while中被删除,所以我们需要留在当前位置查看是否有更多重复项。
  • 我们也可以使用while(current->data == current->next->data)..remove duplicate,在这种情况下,当前增量将是无条件的,因为我们确信所有重复项都已删除。
【解决方案2】:

你需要在while循环中添加一个else才能前进到下一个节点:

if( current-> data == current->next->data ) {
....
} else {
    current = current->next;
}

还需要修复返回值(第一个应该返回 0,第二个应该移到 while 循环之外)。

【讨论】:

  • 为什么current = current->next;else 内部而不是无条件的?
  • 处理多个重复项 (a->a->a->b)
【解决方案3】:

一些快速观察:

return (count) 语句可能在while 循环之外,否则循环将提前终止。

while 循环内需要像 current = current->next; 这样的语句。否则,循环将成为无限循环。

【讨论】:

    【解决方案4】:
    1. 当前应该移动到当前->没有重复匹配的下一个。
    2. 传递给函数的参数应该只是 *list(即指向 struct litem 类型元素的指针)
    3. delete 是 C++ 关键字。请改用free()

    修改后的代码:

    int remove_duplicates(struct litem *list)
    {
        int count = 0; 
        struct litem * current = NULL;
        current = list;
        struct  litem *deleteNode;
        if (current == NULL ) return;
        while(current->next != NULL)
        {
            if ( current->data == current->next->data) 
            {
                count++;
                deleteNode = current->next;
                    current->next= current->next->next;
                        free(deleteNode);
            }
            else
            {
                current = current->next;
            }
        }
        return (count);  
    }
    

    【讨论】:

      【解决方案5】:

      试试这个:

      int remove_duplicates(litem *&list)
      {
         int count = 0; 
         struct litem * current = NULL;
         current = list;
         struct  litem *deleteNode;
         if (current == NULL ) return 0;
         while(current->next != NULL)
         {
           if (current->data == current->next->data) // check for the duplicates 
           {
             count++;
             deleteNode =current->next;
             current->next= current->next->next;
             delete deleteNode;
           }
           else
           {
             current = current->next;
           }
         }
         return (count);
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 2014-07-12
        • 2016-08-23
        • 1970-01-01
        • 2011-11-18
        相关资源
        最近更新 更多