Leetcode 86.分隔链表
题目链接:分隔链表
题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
题目思路:定义两个虚拟头节点,分为为p_max
和p_min
,从头遍历原始链表,如果当前节点值小于 x ,就将当前节点连接到p_min
之后,否则将当前节点连接到p_max
之后,这样遍历完成后,就将小于 x 的节点和大于等于 x 的节点分离开了,最后再将大于等于 x 的链表连接到小于 x 的链表之后,就完成了。注意也要定义两个尾部节点用来更新两个链表的尾部,从而能够方便的连接下一个节点。
题目源代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* p_max = new ListNode(-1);
ListNode* p_min = new ListNode(-1);
ListNode* p_max_tail = p_max;
ListNode* p_min_tail = p_min;
while (head != nullptr)
{
if (head->val < x)
{
p_min_tail->next = head;
p_min_tail = p_min_tail->next;
}
else
{
p_max_tail->next = head;
p_max_tail = p_max_tail->next;
}
head = head->next;
}
p_min_tail->next = p_max->next; //注意是将小链表的尾连接到大链表的虚拟头节点的下一个实值节点。
p_max_tail->next = nullptr;
return p_min->next;
}
};