根据程序提供的LNode结构,删除以h为头结点的有序单链表中的重复元素,并返回删除的元素构成的新单链表(保持原来表中的相对顺序)。
函数接口定义:
LNode* DelR(LNode *h);
其中h
为无附加表头的单链表的首结点地址。要求函数删除单链表中的重复元素,并将删除的元素构成新链表返回(当然是表头结点地址)。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include “stdio.h”
#include “stdlib.h” typedef int dataType; typedef struct node{
dataType data;
struct node next; } LNode; LNode _LNodeN(int n);//测试函数提供的:初始化无附加表头的单链表的函数 void outputL(LNode
*h);//测试函数提供的:输出无附加表头的单链表的函数LNode* DelR(LNode *h);//删除以h为首结点地址的链表中的重复元素,并将删除的元素构成新链表返回
int main(){
int n;scanf("%d",&n);
LNode *H=_LNodeN(n);
outputL(H);
LNode *DH=DelR(H);
outputL(H);outputL(DH);
return 0; }/* 请在这里填写答案 */
输入样例:
一个整数:随机种子,用来产生待处理的链表。
79
输出样例:
第一行是待处理的有序链表。第二行是去重后的链表。第三行被删除的元素构成的链表。
{14,14,15,16,16,17,17,17,17}
{14,15,16,17}
{14,16,17,17,17}
思路
设置一前一后两个链表指针,若是后指针的数==前指针的数,先保存后指针的数据,进行新链表插入,再删除此节点。
代码展示
LNode* DelR(LNode *h){
if(h == NULL) return NULL;//一定要有这步,判断是否为空,有测试点设置
LNode *p1 = h, *p2 = h->next;
LNode *head, *tail, *p;
head = (struct node*) malloc(sizeof(struct node));
head->next = NULL;
tail = head;
while(p2){
if(p2->data == p1->data){
//插入新链表
p = (struct node*) malloc(sizeof(struct node));
p->data = p2->data;
tail->next = p;
tail = p;
//删除
p1->next = p2->next;
free(p2);
}else p1 = p2;
p2 = p1->next;
}
tail->next = NULL;
return head->next;
}