从一个链表channelHead中删除和channelToDeleteHead中相同的元素

删除链表中重复元素
本文介绍了一种从一个链表中删除与另一个链表相同元素的方法,提供了两种实现方式并对比了它们的区别。通过具体实例展示了算法的应用过程。
#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;
}






                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值