题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5
解法1:一个链表,一个个节点找,有就拿到前面
/**
* 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 (NULL == head || NULL == head->next)
return head;
ListNode dummy(0);
dummy.next = head;
ListNode *pre = &dummy; //指向符合条件链表的最后一个节点
ListNode *node = head, *nodePre = &dummy;
while (node) {
if (node->val < x) {
if (pre == nodePre) { //该节点就在pre后面,无需调整node的相对位置
pre = pre->next;
nodePre = nodePre->next;
node = node->next;
} else {
nodePre->next = node->next; //将node拿掉放在pre之后
node->next = pre->next;
pre->next = node;
pre = pre->next;
node = nodePre->next;
}
} else {
nodePre = nodePre->next;
node = node->next;
}
}
return dummy.next;
}
};
解法2:维系两个链表
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (NULL == head || NULL == head->next)
return head;
ListNode dummySmall(0); //符合条件的小数链表
dummySmall.next = head;
ListNode dummyBig(0); //将不符合的节点择出来
ListNode *small = &dummySmall;
ListNode *big = &dummyBig;
while (small->next) {
if (small->next->val < x) {
small = small->next;
} else {
big->next = small->next;
small->next = small->next->next;
big = big->next;
}
}
big->next = NULL; //必须断开末指针
small->next = dummyBig.next; //连接连个链表
return dummySmall.next;
}
};