链表划分【86】(medium)
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
ListNode *less_head = new ListNode(-1); // 临时头节点
ListNode *more_head = new ListNode(-1);
ListNode *less_ptr = less_head; // 指针指向头节点
ListNode *more_ptr = more_head;
while (head) {
if (head->val < x) { // 节点值小于x, 将该节点插入less_ptr后
less_ptr->next = head;
less_ptr = head;
} else { // 否则该节点插入more_ptr后
more_ptr->next = head;
more_ptr = head; // 链表完成后, less_ptr后移,指向head
}
head = head->next;
}
less_ptr->next = more_head->next; // less链表尾与more链表头相连
more_ptr->next = NULL; // 链表尾结点next置空
return less_head->next;
}
};
int main() {
ListNode a(1);
ListNode b(4);
ListNode c(3);
ListNode d(2);
ListNode e(5);
ListNode f(2);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
e.next = &f;
/**
* Input: 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5
*
*
*/
Solution solve;
ListNode *head = solve.partition(&a, 3);
while (head) {
cout << head->val << endl;
head = head->next;
}
return 0;
}