c ++,如何在删除重复项时横切链表

时间:2017-02-20 23:25:32

标签: c++ linked-list

问题:我有一个包含多个数字的.txt文件,我需要按顺序放这些数字以及删除任何重复数据。我已经完成了将它们按顺序排列的功能(它可以工作)。我目前正致力于删除过程。

我不知道如何制作它以便它将贯穿整个列表。因为如果前两个数字是0,它只会删除第一个数字,然后函数结束。

无论如何,这是我迄今为止的删除功能:

void deleteDuplicate(Node*& head) // head is the list with the ordered numbers
{
  Node* tmpPtr;
  Node* delPtr;

  if (head == nullptr){
    return;
  }else if (head->data == head->next->data){
    delPtr = head;
    head = head->next;
    delete delPtr;
  }else{
    tmpPtr = head;
    delPtr = head->next;

    while (delPtr != nullptr && delPtr->data != delPtr->next->data){
      delPtr = delPtr->next;
      tmpPtr = tmpPtr->next;
    }
    if (delPtr != nullptr){
      tmpPtr->next = delPtr->next;
      head = head->next;
      delete delPtr;
    }
   }
  }

1 个答案:

答案 0 :(得分:0)

在提供的源代码中,函数deleteDuplicate()显示分析中缺少两个细节。通过选择在重复的情况下删除第一个节点,有必要更新到第一个节点的链接。

  

不是删除链接列表中的第一个节点,而是更容易   通过将第一个节点路由到第三个节点来删除第二个节点。

缺少分析1 - 第二个if条件必须与一般条件合并。

可以通过删除节点if (head->data == head->next->data)而不是节点head->next来合并案例head

只需删除第二个if条件:

if (head == nullptr){
    return;
}
// to be managed in the else condition
//else if (head->data == head->next->data){
//  delPtr = head;
//  head = head->next;
//  delete delPtr;
//}
else{

缺少分析2 - 在所有重复项的情况下删除第二个节点。

  

要删除第二个节点,请同时比较tmpPtr->data和   delPtr->data代替delPtrdelPtr->next

替换以下while循环:

while (delPtr != nullptr && delPtr->data != delPtr->next->data){
    delPtr = delPtr->next;
    tmpPtr = tmpPtr->next;
}

通过强大的解决方案while-loop:

while ((tmpPtr != nullptr) && (delPtr != nullptr)
        && (tmpPtr->data != delPtr->data)){
    delPtr = delPtr->next;
    tmpPtr = tmpPtr->next;
}

然后在删除时,不要更改head节点:

if (delPtr != nullptr){
    tmpPtr->next = delPtr->next;
    // not needed when deleting the second node
    //head = head->next;
    delete delPtr;
}

奖励 - 添加一个do-while来浏览所有链接列表,deleteDuplicate()的一次调用允许删除所有重复项!!!“

以下是完整的deleteDuplicate()函数:

void deleteDuplicate(Node*& head)
{
    Node* tmpPtr;
    Node* delPtr;

    if (head == nullptr){
        return;
    }
    else{
        do {
            tmpPtr = head;
            delPtr = head->next;

            while ((tmpPtr != nullptr) && (delPtr != nullptr)
                    && (tmpPtr->data != delPtr->data)){
                delPtr = delPtr->next;
                tmpPtr = tmpPtr->next;
            }
            if (delPtr != nullptr){
                tmpPtr->next = delPtr->next;
                delete delPtr;
            }
            // explore all the linked list
        } while (delPtr!=nullptr);
    }
}