2016-02-22 71 views
1

我不知道爲什麼我得到這個段錯誤。我認爲這可能與列表遍歷有關。我在最後猜測,它仍然試圖遍歷,但它看到一個nullptr。刪除鏈接列表C++中的重複項(段錯誤)

我試着把另一個條件,在那裏檢查是否nextNode是一個nullptr然後停止遍歷,但我無法得到它的工作。

我錯過了什麼?

void LinkedList::removeDuplicates() 
{ 
    Node* traverse = m_front; 
    Node* nextNode = traverse->getNext(); 
    Node* duplicate = nullptr; 

    if (!isEmpty()) 
    { 
     while(traverse != nullptr) 
     { 
      if (traverse->getValue() == nextNode->getValue()) 
      { 
       std::cout << "Found duplicate\n"; 
       duplicate = nextNode; 
       nextNode = nextNode->getNext(); 

       delete duplicate; 
       duplicate = nullptr; 

       traverse->setNext(nextNode); 
      } 

      traverse = nextNode; 
      nextNode = nextNode->getNext(); 
     } 
    } 
} 
+1

對於崩潰,請包括崩潰發生的行號以及堆棧跟蹤。 – MrEricSir

回答

1

您的代碼假定列表已排序,否則根本不起作用。

如果列表爲空,則遍歷將爲空,並且nextNode的初始化將崩潰。

最後一行也會崩潰,因爲上次遍歷將爲null,並且nextnode將爲null。

我剛剛重新nextNode和改變,而條件:

void LinkedList::removeDuplicates() 
{ 
    Node* traverse = m_front; 
    Node* duplicate = nullptr; 

    if (!isEmpty()) 
    { 
     Node* nextNode = traverse->getNext(); 
     while(nextNode != nullptr) 
     { 
      if (traverse->getValue() == nextNode->getValue()) 
      { 
       std::cout << "Found duplicate\n"; 
       duplicate = nextNode; 
       nextNode = nextNode->getNext(); 

       delete duplicate; 
       duplicate = nullptr; 

       traverse->setNext(nextNode); 
       continue; // Don't advance again, we already skipped an element. 
      } 

      traverse = nextNode; 
      nextNode = nextNode->getNext(); 
     } 
    } 
} 

編輯:增加繼續迴避問題,刪除最後一個元素和問題連續跳躍式三份,。

+0

是的,這個問題假設列表已排序,所以我不擔心實施排序。 – heyyo

+1

如果一行中有兩個以上的重複值,則原始版本和建議的解決方案也將無法正常工作。例如,如果行中有三個重複值,則只會刪除第二個重複值。該列表將以兩個重複值,最初的第一個值和最初的第三個值結尾。 –

+0

是的,它會崩潰。我正在修復它,而你鍵入我認爲的評論:) –