版权声明:本文为博主原创文章,未经博主允许不得转载。 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,分组后结果。