思路1:如果碰到相同的就删除
void deleteDuplicate(LinkList List)
{
List = List->next;//前进到第一位数据
if (List == NULL)//如果不为空
{
cout << "false" << endl;
return;
}
while (List->next)
{
if (List->data != List->next->data)
{
List = List->next;
}
else
{
LinkList temp = List->next;
List->next = temp->next;
free(temp);
}
}
}
思路2:把不相同数据的第一个节点都搬到表头,然后删除后面冗余的链表(比较愚蠢,方法3的傻瓜版)
void deleteDuplicate2(LinkList List)
{
LinkList List_first = List->next;//开始节点
LinkList List_now = List;//头结点
while (List_now->next)
{
if (List_first->data == List_now->next->data)//如果元素值相同
{
List_now = List_now->next;//List_now前进一格
}
else
{
LinkList temp = List_now->next;//保存要移动的节点
List_now->next = temp->next;//重新连接链表,并指向下一个节点
temp->next = List_first->next;//插入不重复表的最后端
List_first->next = temp;
List_first = temp;//first前进道不重复表的最后端
}
}
LinkList p = List_first->next;//指向重复表的第一个元素
while (p != NULL)
{
LinkList fuck = p->next;
free(p);
p = fuck;
}
List_first->next = NULL;
}
方法3:依次将序列中每个连续相同的子序列的第一个元素移动到表的前端
void deleteDuplicate3(LinkList List)
{
LinkList start = List->next;
if (!start)
{
return;
}
LinkList now = start->next;
while (now)
{
if (now->data != start->data)
{
start->next->data = now->data;//把发现不同的值赋值给start的下一个节点
now = now->next;//now前进一格
start = start->next;//start前进一格
}
else
{
now = now->next;//now前进一格
}
}
LinkList Link_delete = start->next;//待删除节点的一个节点
while (Link_delete)//删除后面的节点
{
LinkList temp = Link_delete->next;
free(Link_delete);
Link_delete = temp;
}
start->next = NULL;//收官
}