给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
点题:链表题是弱项,指针部分需要补充了
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: The first node of linked list
* @param x: An integer
* @return: A ListNode
*/
ListNode * partition(ListNode * head, int x) {
// write your code here
ListNode* dummy = new ListNode(1);
dummy->next = head;
ListNode* cur = dummy;
while (cur->next != NULL && cur->next->val < x) {
cur = cur->next;
}
ListNode* little_prev = cur;
while (cur->next != NULL) {
if (cur->next->val < x) {
ListNode* tmp = cur->next->next;
cur->next->next = little_prev->next;
little_prev->next = cur->next;
little_prev = cur->next;
cur->next = tmp;
} else {
cur = cur->next;
}
}
return dummy->next;
}
};
指针加强前的code
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: The first node of linked list
* @param x: An integer
* @return: A ListNode
*/
ListNode * partition(ListNode * head, int x) {
// write your code here
if (head == NULL) {
return head;
}
ListNode* dummy1 = new ListNode(INT_MIN);
ListNode* dummy2 = new ListNode(INT_MAX);
dummy1->next = head;
dummy2->next = head;
ListNode* lastlittle = dummy1;
ListNode* lastbig = dummy2;
while (head != NULL) {
if (head->val < x) {
if (lastlittle->next == head) {
lastlittle = head;
head = head->next;
} else {
lastbig->next = head->next;
head->next = lastlittle->next;
lastlittle->next = head;
lastlittle = head;
head = lastbig->next;
}
} else {
lastbig = head;
head = head->next;
}
}
return dummy1->next;
}
};