初夏小谈:分割链表(链表进阶操作)

分割链表:

在单链表中取任意一个结点的数据,然后对链表进行排列,比它小的排在它前面,大于等于它的排在它后面,要求保持原相对顺序不变。

先不看这个操作链表,看到这种做法我就想起了一种排序的做法,不知道大家想起了没有。那就是快速排序思想。在后面的文章中我会尽力去挖掘快排,为大家展现快排的魅力。

因为任意取结点中的数据作为参考值,所以就可以把源结点分为两部分即:比参考结点的数据小的在一起,其它的放在一起。这样分类后,就可能存在小的没有,或大于等于的也没有。对特殊情况也要充分考虑。

因此就可以定义两个头指针经过一系列的尾插过程,最后再把两个链表连接起来。

代码实现:

void MidOrdered(LinkList* first, DataType data)
{
	assert(first);
	if (first->head == NULL)
	{
		return;
	}
	LinkList* LTPtr = (LinkList*)malloc(sizeof(LinkList));
	InitLinkList(LTPtr);
	LinkListNode* LTRailPtr = NULL;
	LinkList* ETGTPtr = (LinkList*)malloc(sizeof(LinkList));
	InitLinkList(ETGTPtr);
	LinkListNode* ETGTRailPtr = NULL;
	LinkListNode* ptr = first->head;
	while (ptr != NULL)
	{
		if (ptr->data < data)
		{
			if (LTPtr->head == NULL)
			{
				LTPtr->head  = ptr;
				LTRailPtr = ptr;
				ptr = ptr->next;
				LTRailPtr->next = NULL;
			}
			else
			{
				LTRailPtr->next = ptr;
				ptr = ptr->next;
				LTRailPtr = LTRailPtr->next;//把最后一个指针往后移
				LTRailPtr->next = NULL;
			}
		}
		else
		{
			if (ETGTPtr->head == NULL)
			{
				ETGTPtr->head = ptr;
				ETGTRailPtr = ptr;
				ptr = ptr->next;
				ETGTRailPtr->next = NULL;
			}
			else
			{
				ETGTRailPtr->next = ptr;
				ptr = ptr->next;
				ETGTRailPtr = ETGTRailPtr->next;
				ETGTRailPtr->next = NULL;
			}
		}
	}
	if (LTPtr->head == NULL)
	{
		first->head = ETGTPtr->head;
	}
	else if (LTPtr->head != NULL && ETGTPtr->head == NULL)
	{
		first->head = LTPtr->head;
	}
	else 
	{
		LTRailPtr->next = ETGTPtr->head;
		first->head = LTPtr->head;
	}
}

在开始操作链表前一定要对指针进行初始化。指针就像一条没栓链子的狗狗一样,它可能做出一些不可思议的操作,所以就要初始化就如同给狗狗拴上链子一样。完成分割合并中,一定注意及时更新指针。

                                                                                                                                                                 珍&源码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值