#include <iostream>
using namespace std;
//从一个链表head1中删除和head2中相同的元素
struct Node
{
Node(int x)
{
value = x;
next = NULL;
}
int value;
Node *next;
};
//共同点用一个节点Node *pre来标志是否要更新头节点
//方法一:
unsigned int deleteDuplication1(Node **head1, Node *head2)
{
int count = 0;
while (head2)
{
Node *pre = NULL;
Node *cur = *head1;//原链表的节点
while (cur)
{
if (cur->value == head2->value)
{
count++;
Node *pNext = cur->next;//先保留cur的下一个节点
delete cur;
cur = pNext;
if (pre == NULL)//说明在链表head1中,此时的cur前面还没出现与head2这个节点不同的元素
*head1 = cur;
else
pre->next = cur;
}
else
{
pre = cur;
cur = cur->next;
}
}
head2 = head2->next;
}
return count;
}
//方法二
unsigned int deleteDuplication2(Node **head1, Node *head2)
{
int count = 0;
while (head2)
{
Node *pre = NULL;
Node *cur = *head1;
while (cur)
{
bool needDelete = false;
if (cur->value == head2->value)
needDelete = true;
if (!needDelete)
{
pre = cur;
cur = cur->next;
}
else
{
int value = cur->value;
Node *pNext = NULL;
while (cur && cur->value == value)//与方法一的不同之处多了一个循环
{
count++;
pNext = cur->next;//保留cur的下一个节点
delete cur;
cur = pNext;
}
if (pre == NULL)//说明在链表head1中,此时的cur前面还没出现与head2这个节点不同的元素
*head1 = cur;
else
pre->next = cur;
}
}
head2 = head2->next;
}
return count;
}
void print(Node *head)
{
while (head)
{
cout << head->value << " ";
head = head->next;
}
cout << endl;
}
int main()
{
//建立第1个链表
Node *p1 = new Node(3);
Node *p2 = new Node(2);
Node *p3 = new Node(3);
Node *p4 = new Node(3);
Node *p5 = new Node(4);
Node *p6 = new Node(4);
p1->next = p2;
p2->next = p3;
p3->next = p4;
p4->next = p5;
p5->next = p6;
//打印第1个链表
print(p1);
//建立第2个链表
Node *q1 = new Node(3);
Node *q2 = new Node(3);
Node *q3 = new Node(4);
Node *q4 = new Node(4);
q1->next = q2;
q2->next = q3;
q3->next = q4;
//打印第2个链表
print(q1);
int count = deleteDuplication1(&p1, q1);
//int count = deleteDuplication2(&p1, q1);
//删除之后,打印
printf("删除后,第一个链表为:\n");
print(p1);
cout << "删除的个数为:" << count << endl;
return 0;
}