荷兰国旗问题---按小于、等于、大于分组链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shanghx_123/article/details/86555044

题目描述:

给定一个链表的头节点head,再给定一个数num,请把链表调整成节点值小于num的节点都放在链表的左边,值等于num的节点都放在链表的中间,值大于num的节点,都放在链表的右边。
解法一:
1.将链表的所有节点放入到数组中,然后将数组进行快排划分的调整过程。
2.然后将数组中的节点一次重新串连。
时间复杂度O(n),空间复杂度O(n)
2.解法二(最优解):
1.将原始链表分解为三个小链表,分别是值小于num的链表,值等于num的小链表,和值大于num的链表
2.将三条链表整体连接起来
时间复杂度O(n),空间复杂度O(1)

PNode GroupList(PNode head, DataType data)//荷兰国旗问题,按小于等于大于分组链表
{
	if (head == NULL)
		return head;
	PNode less = NULL, mid = NULL, more = NULL;//遍历三个小链表的指针
	PNode lesshead= NULL, midhead = NULL, morehead = NULL;//用来保存三个链表的头
	PNode cur = head;//遍历原始链表的指针
	while (cur != NULL)
	{
		if (cur->data < data)
		{
			if (less != NULL)
			{
				//往后更新节点
				less->p_next = cur;
				less = cur;		
			}	
			else
			{
				//保存头节点
				less = cur;
				lesshead = cur;
		
			}
		}			
		else if (cur->data == data)
		{
			if (mid != NULL)
			{
				//往后更新节点
				mid->p_next = cur;
				mid = cur;
				
			}
			else
			{
				//保存头节点
				mid = cur;
				midhead = cur;
			}
		}
		else
		{
			if (more != NULL)
			{
				//往后更新节点
				more->p_next = cur;
				more = cur;		
			}		
			else
			{
				//保存头节点
				more = cur;
				morehead = cur;
			}
		}
		//往后遍历原始链表
		cur = cur->p_next;		
	}
	//连接三个链表
	less->p_next = midhead;
	mid->p_next = morehead;
	more->p_next = NULL;
	return lesshead;
}

结果:num为5,分组后结果。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/shanghx_123/article/details/86555044
今日推荐