用于从排序链表中删除所有重复项的 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)
有关详细信息,请参阅有关从排序的链接列表中删除所有重复项的完整文章!