2017-02-20 58 views
-2

問題:我有一個包含多個數字的.txt文件,我需要按順序放置這些數字以及刪除任何重複項。我已經完成了將它們整理的功能(它有效)。我目前正在進行刪除過程。C++,如何橫切鏈接列表,同時刪除重複項

我不知道如何使它能夠貫穿整個列表。因爲如果前兩個數字是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; 
    } 
    } 
    } 
+2

使用正確的工具來解決這些問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

您是否允許不插入重複項? – user4581301

+0

從另一個角度來看,您可能不希望以這種方式實現該功能。賠率是好的,你有一個刪除功能,你已經測試和知道的作品。如果你不考慮製作和測試一個。只需迭代一次,然後爲每個要刪除的節點調用預先存在的刪除功能。 – user4581301

回答

0

在提供的源代碼,功能deleteDuplicate()揭示了分析兩名失蹤的細節。通過選擇在重複的情況下刪除第一個節點,有必要更新鏈接到第一個節點。

而不是刪除第一個節點,在鏈表中,更容易通過將第一個節點路由到第三個節點來刪除第二個節點。

缺少分析1 - 第二如果條件必須與一般條件進行合併。

可通過刪除節點head->next而不是節點head合併案例if (head->data == head->next->data)

只需卸下第二,如果條件:

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->datadelPtr->data代替delPtrdelPtr->next

更換以下while循環:

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

通過一個強大的解決方案,同時循環:

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); 
    } 
}