006分隔链表

题目描述

给你一个链表的头节点 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]

思路

1、创建两个空的链表,less_head和greater_head指向开辟两个哨兵位的头结点。
2、同时定义一个less_tail和greater_tail用来始终指向这两个链表的尾部,方便尾插
3、遍历原链表,将小于特定值x的节点尾插到less_head链表,将大于等于特定值x的节点尾插到greater_head链表
4、将less_head链表和greater_head链表链接到一起
5、然后将链接后的链表的尾节点的next置为NULL,防止成环
6、最后释放两个哨兵位的头结点并返回链接后的链表

代码实现

struct ListNode
{
	int val;
	struct ListNode* next;
};

struct ListNode* partition(struct ListNode* head, int x)
{
	// 开辟两个哨兵位的头结点,方便尾插
	struct ListNode* less_head, * less_tail, * greater_head, * greater_tail;
	less_head = less_tail = (struct ListNode*)malloc(sizeof(struct ListNode));
	less_tail->next = NULL;
	greater_head = greater_tail = (struct ListNode*)malloc(sizeof(struct ListNode));
	greater_tail->next = NULL;

	struct ListNode* cur = head;
	
	while (cur)
	{
		// 小于特定值x时尾插到less_head
		if (cur->val < x)
		{
			less_tail->next = cur;
			less_tail = cur;
		}
		// 大于等于特定值x时尾插到greater_head
		else
		{
			greater_tail->next = cur;
			greater_tail = cur;
		}
		cur = cur->next;
	}

	// 将less_head链接到greater_head
	less_tail->next = greater_head->next;
	// 将链接后新的链表的尾节点的next置为NULL,防止成环
	greater_tail->next = NULL;

	// 用newhead记录操作完成的链表的第一个节点
	struct ListNode* newhead = less_head->next;
	// 释放两个哨兵位的头结点
	free(less_head);
	free(greater_head);

	return newhead;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值