C语言-数据结构-链表分割

文章详细描述了如何使用C++实现链表分区,将小于给定值x的节点排列在大于等于x的节点之前
摘要由CSDN通过智能技术生成

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200] 内
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

此题思路: 新建两个链表,一个小于x的链表,一个大于等于x的链表,遍历原链表,将小于x的结点插入到小于x的链表中,将大于等于x的结点插入到大于等于x的链表中,最后将两个链表拼接起来。

在最后要记得将大于等于x的链表的最后一个节点指向空

最后用一个新的指针指向小于x的链表,然后释放小于x的链表和大于等于x的链表。

struct ListNode* partition(struct ListNode* head, int x){
    struct ListNode* lessHead = NULL;
	struct ListNode* lessTail = NULL;
	struct ListNode* greaterHead = NULL;
	struct ListNode* greaterTail = NULL;
	struct ListNode* cur = head;
	//开一个哨兵节点
	lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
    lessTail->next = NULL;
	greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
    greaterTail->next = NULL;
	//遍历链表
	while (cur)
	{
		if (cur->val < x)
		{
			 lessTail->next = cur;
			 lessTail = lessTail->next;
		}
		else
		{
			greaterTail->next = cur;
			greaterTail = greaterTail->next;
		}
		cur = cur->next;
	}
	//拼接两个链表
	lessTail->next = greaterHead->next;
	greaterTail->next = NULL;
	struct ListNode* p = lessHead->next;
    free(lessHead);
	free(greaterHead);
	return p;
}

测试代码

void test(SLTNode* plist)
{
	SLTNode* new_head = partition(plist, 30);
	SListPrint(new_head);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值