Leetcode 86 Partition List
题目原文
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
题意分析
给定一个链表,链表存储一串数,对一个数x,重构链表,使得小于x的数在大于或等于x的数的左边,且保持原顺序不变。
解法分析
构建两个链表,一个首地址为lessNode,一个首地址为greaterNode,通过修改next指针的操作,将小于x的node链接到lessNode上,C++代码如下:
/**
* 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) {
ListNode *nextNode=head;
ListNode *lessNode,*temp1,*greaterNode,*temp2;
int less=0,greater=0;
while(nextNode!=NULL){
if((*nextNode).val<x){//use (*nextNode).val
if(less==0){
lessNode=nextNode;
temp1=lessNode;
less=1;
}
else{
(*temp1).next=nextNode;
temp1=nextNode;
}
}
else{
if(greater==0){
greaterNode=nextNode;
temp2=greaterNode;
greater=1;
}
else{
(*temp2).next=nextNode;
temp2=nextNode;
}
}
//cout<<(*nextNode).val<<endl;
nextNode=(*nextNode).next;
}
if(less==0||greater==0){
return head;
}
(*temp1).next=greaterNode;
(*temp2).next=NULL;//the end node's next should be NULL
ListNode *pp=lessNode;
// while(pp!=NULL){
// cout<<(*pp).val<<endl;
//pp=(*pp).next;
// }
return lessNode;
}
};
注意全序列没有小于x或只有小于x的数的情况,这时直接返回head。对于一般情况,需要在最后让temp2.next为NULL,不然输出程序会进入死循环。