📌  相关文章
📜  用于从排序链表中删除所有重复项的 C++ 程序

📅  最后修改于: 2022-05-13 01:57:46.071000             🧑  作者: Mango

用于从排序链表中删除所有重复项的 C++ 程序

给定一个排序的链表,删除所有具有重复数字(所有出现)的节点,只留下在原始列表中出现一次的数字。
例子:

Input: 23->28->28->35->49->49->53->53
Output: 23->35

Input: 11->11->11->11->75->75
Output: empty List

请注意,这与从链接列表中删除重复项不同

这个想法是维护一个指向节点的指针(prev) ,该节点恰好位于我们正在检查重复的节点块之前。在第一个示例中,当我们检查节点 28 的重复项时,指针prev将指向 23。一旦我们到达值为 28 的最后一个重复节点(将其命名为当前指针),我们可以使 prev 节点的下一个字段成为当前的下一个并更新current=current.next 。这将删除具有重复项的值为 28 的节点块。

C++
// C++ program to remove all occurrences 
// of duplicates from a sorted linked list.
#include 
using namespace std;
  
// A linked list node
struct Node
{
    int data;
    struct Node *next;
};
  
// Utility function 
// to create a new Node
struct Node *newNode(int data)
{
    Node *temp = new Node;
    temp -> data = data;
    temp -> next = NULL;
    return temp;
}
  
// Function to print nodes 
// in a given linked list.
void printList(struct Node *node)
{
    while (node != NULL)
    {
        printf("%d ", node -> data);
        node = node -> next;
    }
}
  
// Function to remove all occurrences
// of duplicate elements
void removeAllDuplicates(struct Node* &start)
{
    // Create a dummy node that acts like 
    // a fake head of list pointing to the 
    // original head
    Node* dummy = new Node;
  
    // Dummy node points to the original head
    dummy -> next = start;
      
    // Node pointing to last node which has 
    // no duplicate.
    Node* prev = dummy;
      
    // Node used to traverse the linked list.
    Node* current = start;
  
    while(current != NULL)
    {
        // Until the current and previous 
        // values are same, keep updating current
        while(current -> next != NULL &&
              prev -> next -> data == current -> next -> data)
            current = current -> next;
  
        // if current has unique value 
        // i.e current is not updated, 
        // Move the prev pointer to 
        // next node
        if (prev -> next == current)
            prev = prev -> next;
  
        // When current is updated to the 
        // last duplicate value of that segment, 
        // make prev the next of current
        else
            prev -> next = current -> next;
  
        current = current -> next;
    }
  
    // Update original head to the next 
    // of dummy node 
    start = dummy -> next;
}
  
// Driver Code
int main() 
{
    // 23->28->28->35->49->49->53->53
    struct Node* start = newNode(23);
    start -> next = newNode(28);
    start -> next -> next = newNode(28);
    start -> next -> 
             next -> next = newNode(35);
    start -> next -> 
    next -> next -> next = newNode(49);
    start -> next -> 
    next -> next -> 
    next -> next = newNode(49);
    start -> next -> 
    next -> next -> 
    next -> next -> next = newNode(53);
    start -> next -> 
    next -> next -> 
    next -> next -> 
    next -> next = newNode(53);
    cout << "List before removal " <<
            "of duplicates";
    printList(start);
      
    removeAllDuplicates(start);
      
    cout << "List after removal " << 
            "of duplicates";
    printList(start);
    return 0;
}
// This code is contributed by NIKHIL JINDAL


输出:

List before removal of duplicates
23 28 28 35 49 49 53 53 
List after removal of duplicates
23 35 

时间复杂度: O(n)
有关详细信息,请参阅有关从排序的链接列表中删除所有重复项的完整文章!