删除无序单链表中的值域重复的结点
题目:
有一个带头结点的单链表head,其中可能出值域重复的结点,设计一个算法删除值域重复的结点。要求在主函数中调用设计的算法,给出结果。
思路:删除某个结点值的重复结点,只需要遍历单链表找到与之相同的结点删除即可。删除多个不同结点值的重复结点,可以按链表顺序一个一个调用删除函数即可。因此可以使用递归实现。
测试数据:
样例1:1、2、3、4、5、6、7、8、9、0
输出1:1、2、3、4、5、6、7、8、9、0
样例2:1、2、3、4、3、5、5、6、7、8
输出2:1、2、3、4、5、6、7、8
样例3:1、1、1、1、5、5、7、8、8、8
输出3:1、5、7、8
细节:
定位到重复结点s的前一个结点q,方便修改指针,进行建链操作:q->next=s->next;递归调用删除重载私有函数时,需要判断指针不为空,在此处犯过错。
#include<iostream>
using namespace std;
template<typename DataType>
struct Node
{
DataType data;//数据域
Node<DataType>*next;//指针域
};
template<class DataType>
class LinkList
{
public:
LinkList();//建立只有头结点一个空链表
LinkList(DataType a[], int n);//建立n个元素的单链表
~LinkList();//析构函数
void Delete();//删除操作
void PrintList();//输出
private:
Node<DataType>*head;
void Delete(Node<DataType>*p);//递归删除
};
template<class DataType>
LinkList<DataType>::LinkList()
{
head = new Node<DataType>;//生成头结点
head->next = nullptr;//判空条件
}
template<class DataType>
LinkList<DataType>::LinkList(DataType a[], int n)//头插法
{
head