本题要求实现一个函数, pur_LinkList(LinkList L)函数是删除带头结点单链表的重复结点。
函数接口定义:
void pur_LinkList(LinkList L);
其中 L
是用户传入的参数。 L
是带头结点单链表的头指针。
裁判测试程序样例:
输入样例:
在这里给出一组输入。例如:
1 2 3 3 3 4 5 6 7 8 -1
输出样例:
在这里给出相应的输出。例如:
1 2 3 4 5 6 7 8
思路:
- 首先,定义两个指针p和pn,分别指向链表的头节点和头节点的下一个节点。
- 循环条件是p不为NULL
- 在循环中,将pn重新指向p,进行新一轮的比较
- 第二个while循环,循环条件是pn的下一个节点不为NULL,pn->next==NULL即找到最后一个节点
- 判断p->data和pn->next->data是否相等,如果相等,则将pn的下一个节点删除,将pn->next指向pn->next->next
- 如果p->data和pn->next->data不相等,则将pn指向pn的下一个节点,即pn向后移动一位。
- 内层循环结束后,将p指向下一个节点,即p向后移动一位。
- 外层循环结束后,整个链表的去重操作完成。
总体来说,这段代码使用了两层循环,外层循环遍历链表的每一个节点,内层循环用于比较外层节点与其后面的节点是否相等,并进行去重操作。
void pur_LinkList(LinkList L)
{
LinkList p=L->next;// 找到头节点
LinkList pn=L;
while(p!=NULL)
{
pn=p;// 让内层的指针pn指向外层指针p
while(pn->next!=NULL)// 内层指针pn->next==NULL,表示最后一个元素
{
if(p->data == pn->next->data)// 外层第一个和内层每一个比较去重
pn->next=pn->next->next;
else
pn=pn->next;
}
p=p->next;// 外层向后移
}
}