题目描述
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
#include<bits/stdc++.h>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
vector<int> little;
vector<int> big;
ListNode *head = NULL;
ListNode *lastNode = NULL;
while(pHead)
{
if(pHead -> val < x)
little.push_back(pHead -> val);
else
big.push_back(pHead -> val);
pHead = pHead -> next;
}
for(vector<int> :: iterator itr = little.begin(); itr != little.end(); itr++)
{
if(head == NULL)
{
ListNode* l = new ListNode(*itr);
head = l;
lastNode = head;
}
else
{
ListNode* l = new ListNode(*itr);
lastNode -> next = l;
lastNode = lastNode -> next;
}
}
for(vector<int> :: iterator itr= big.begin(); itr != big.end(); itr++)
{
if(head == NULL)
{
ListNode* l = new ListNode(*itr);
head = l;
lastNode = head;
}
else
{
ListNode* l = new ListNode(*itr);
lastNode -> next = l;
lastNode = lastNode -> next;
}
}
return head;
}
};
int main()
{
ListNode l1(5);
ListNode l2(1);
ListNode l3(4);
ListNode l4(2);
l1.next = &l2;
l2.next = &l3;
l3.next = &l4;
Partition p;
ListNode *ans = p.partition(&l1, 3);
while(ans)
{
cout << ans -> val << endl;
ans = ans -> next;
}
return 0;
}