【数据结构】递增链表删除重复的节点

思路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;//收官
}

猜你喜欢

转载自blog.csdn.net/qq_35564841/article/details/81209018
今日推荐