目录
一、题目描述
二 、算法思想
题中要求设计时间复杂度尽可能高效的算法,所以可以用空间换时间,创建一个长为链表长+1的数组,如果第一次遍历链表的数据在数组对应下标中没有出现过即对应下标数组值为0,则对数组值进行加一操作,如果出现则进行删除节点操作。删除节点需要pre前置指针,和p当前指针方便删除重复出现的数据。
三、代码实现
#include <stdio.h>
#include <stdlib.h>
/**
* 2015年真题
*/
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int Get_len(LinkList list)
{
LNode *p = list->next;
int len = 0;
while (p != NULL)
{
len ++;
p = p->next;
}
return len;
}
void del_same(LinkList L)
{
int len = Get_len(L);
int* arr = (int*)malloc((len+1)*(sizeof(int)));
for (int i = 0; i < len+1; ++i) {
arr[i] = 0;
}
LNode * p = L->next;
LNode * pre = L->next;
p = p->next;
pre->next = p;
while (p != NULL)
{
if (arr[p->data] == 0)
{
arr[p->data] ++;
p = p->next;
pre->next = p;
}
else
{
pre->next = p->next;
p=p->next;
}
}
}