难度:中等
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5
题目解析:
使用双指针法,进行分离,将大于等于x的分到temp_head2节点后面,将小于x的节点分到temp_head1节点后面,最后将temp_head2连接到temp_head1后面,并且temp_head2最后一个节点后面置为NULL
参考代码:
/**
* 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) {
if(head == NULL)
return NULL;
ListNode* temp_head1 = new ListNode(-1);//建立两个临时节点
ListNode* temp_head2 = new ListNode(-1);
ListNode* p1 = temp_head1;
ListNode* p2 = temp_head2;
ListNode* pMove = head;
while(pMove)//将原链表分离成两条链表
{
if(pMove->val < x)
{
p1->next = pMove;
p1 = p1->next;
}else{
p2->next = pMove;
p2 = p2->next;
}
pMove = pMove->next;
}
p1->next = temp_head2->next;//将两条链表再连接起来
p1 = p1->next;
p2->next = NULL;//最后一个节点后面置NULL
return temp_head1->next;
}
};