/*
CTCI: 2.4
Partition a linked list at value x. ALl the noeds less than x comes before
x and all the nodes more thna x come after
*/
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
Node *create_node(int val){
Node *tmp = new Node();
if (tmp == NULL){
cout<<"Memeory allocation failed";
return 0;
} else {
tmp->data = val;
tmp->next = NULL;
return tmp;
}
}
void createSLL(Node *& head, int d){
Node *tmp = create_node(d);
Node *ptr;
if (head == NULL)
head = tmp;
else{
ptr = head;
while(ptr->next != NULL)
ptr = ptr->next;
ptr->next = tmp;
}
}
void display(Node *head){
Node *ptr = head;
if (ptr == NULL)
return;
while(ptr->next != NULL){
cout<<ptr->data<<"->";
ptr = ptr->next;
}
cout<<ptr->data<<endl;
}
Node *pivotPartition(Node * head, int data){
Node *firsthead = NULL;
Node *secondhead = NULL;
Node *tmp = head;
if(tmp == NULL)
return NULL;
while(tmp != NULL){
Node *next = tmp->next;
if(tmp->data < data){
tmp->next = firsthead;
firsthead = tmp;
}
else{
tmp->next = secondhead;
secondhead = tmp;
}
tmp = next;
}
if(firsthead == NULL)
return secondhead;
else
tmp = firsthead;
while(tmp->next != NULL)
tmp = tmp->next;
tmp->next = secondhead;
while(firsthead != NULL){
cout<<firsthead->data;
firsthead = firsthead->next;
}
return firsthead;
}
int main(int argc, char const *argv[])
{ Node *head;
createSLL(head, 3);createSLL(head, 9);createSLL(head, 7);
createSLL(head, 1);createSLL(head, 4);createSLL(head, 8);
display(head);
Node *p = pivotPartition(head, 4);
return 0;
}
LyoKQ1RDSTogMi40CgpQYXJ0aXRpb24gYSBsaW5rZWQgbGlzdCBhdCB2YWx1ZSB4LiBBTGwgdGhlIG5vZWRzIGxlc3MgdGhhbiB4IGNvbWVzIGJlZm9yZQp4IGFuZCBhbGwgdGhlIG5vZGVzIG1vcmUgdGhuYSB4IGNvbWUgYWZ0ZXIKKi8KCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IE5vZGUKewogICAgaW50IGRhdGE7CiAgICBOb2RlICpuZXh0OyAgIAp9OwoKTm9kZSAqY3JlYXRlX25vZGUoaW50IHZhbCl7CiAgICBOb2RlICp0bXAgPSBuZXcgTm9kZSgpOwoKICAgIGlmICh0bXAgPT0gTlVMTCl7CiAgICAgICAgY291dDw8Ik1lbWVvcnkgYWxsb2NhdGlvbiBmYWlsZWQiOwogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICB0bXAtPmRhdGEgPSB2YWw7CiAgICAgICAgdG1wLT5uZXh0ID0gTlVMTDsKICAgICAgICByZXR1cm4gdG1wOwogICAgfQp9IAoKdm9pZCBjcmVhdGVTTEwoTm9kZSAqJiBoZWFkLCBpbnQgZCl7CiAgICBOb2RlICp0bXAgPSBjcmVhdGVfbm9kZShkKTsKICAgIE5vZGUgKnB0cjsKICAgIGlmIChoZWFkID09IE5VTEwpCiAgICAgICAgaGVhZCA9IHRtcDsKICAgIGVsc2V7CiAgICAgICAgcHRyID0gaGVhZDsKICAgICAgICB3aGlsZShwdHItPm5leHQgIT0gTlVMTCkKICAgICAgICAgICAgcHRyID0gcHRyLT5uZXh0OwogICAgICAgIHB0ci0+bmV4dCA9IHRtcDsKICAgIH0KfQoKdm9pZCBkaXNwbGF5KE5vZGUgKmhlYWQpewogICAgTm9kZSAqcHRyID0gaGVhZDsKICAgIGlmIChwdHIgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICB3aGlsZShwdHItPm5leHQgIT0gTlVMTCl7CiAgICAgICAgY291dDw8cHRyLT5kYXRhPDwiLT4iOwogICAgICAgIHB0ciA9IHB0ci0+bmV4dDsKICAgIH0KICAgIGNvdXQ8PHB0ci0+ZGF0YTw8ZW5kbDsKfQoKTm9kZSAqcGl2b3RQYXJ0aXRpb24oTm9kZSAqIGhlYWQsIGludCBkYXRhKXsKICAgIE5vZGUgKmZpcnN0aGVhZCA9IE5VTEw7CiAgICBOb2RlICpzZWNvbmRoZWFkID0gTlVMTDsKICAgIE5vZGUgKnRtcCA9IGhlYWQ7CgogICAgaWYodG1wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgd2hpbGUodG1wICE9IE5VTEwpewogICAgICAgIE5vZGUgKm5leHQgPSB0bXAtPm5leHQ7CiAgICAgICAgaWYodG1wLT5kYXRhIDwgZGF0YSl7CiAgICAgICAgICAgIHRtcC0+bmV4dCA9IGZpcnN0aGVhZDsKICAgICAgICAgICAgZmlyc3RoZWFkID0gdG1wOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICB0bXAtPm5leHQgPSBzZWNvbmRoZWFkOwogICAgICAgICAgICBzZWNvbmRoZWFkID0gdG1wOwogICAgICAgIH0KICAgICAgICB0bXAgPSBuZXh0OwogICAgfQogICAgaWYoZmlyc3RoZWFkID09IE5VTEwpCiAgICAgICAgcmV0dXJuIHNlY29uZGhlYWQ7CiAgICBlbHNlCiAgICAgICAgdG1wID0gZmlyc3RoZWFkOwogICAgd2hpbGUodG1wLT5uZXh0ICE9IE5VTEwpCiAgICAgICAgdG1wID0gdG1wLT5uZXh0OwogICAgdG1wLT5uZXh0ID0gc2Vjb25kaGVhZDsKICAgIHdoaWxlKGZpcnN0aGVhZCAhPSBOVUxMKXsKICAgICAgICBjb3V0PDxmaXJzdGhlYWQtPmRhdGE7CiAgICAgICAgZmlyc3RoZWFkID0gZmlyc3RoZWFkLT5uZXh0OwogICAgfQogICAgcmV0dXJuIGZpcnN0aGVhZDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKeyAgIE5vZGUgKmhlYWQ7CiAgICBjcmVhdGVTTEwoaGVhZCwgMyk7Y3JlYXRlU0xMKGhlYWQsIDkpO2NyZWF0ZVNMTChoZWFkLCA3KTsKICAgIGNyZWF0ZVNMTChoZWFkLCAxKTtjcmVhdGVTTEwoaGVhZCwgNCk7Y3JlYXRlU0xMKGhlYWQsIDgpOwogICAgZGlzcGxheShoZWFkKTsKICAgIE5vZGUgKnAgPSBwaXZvdFBhcnRpdGlvbihoZWFkLCA0KTsKCiAgICByZXR1cm4gMDsKfQ==