/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
#include <asm-generic/errno.h>
class Partition {
  public:
    ListNode* partition(ListNode* pHead, int x) {
    if(pHead==NULL)return NULL;
    struct ListNode* lessthan=(struct ListNode*)malloc(sizeof(struct ListNode));
    lessthan->next=NULL;
   
     struct ListNode* greaterthan=(struct ListNode*)malloc(sizeof(struct ListNode));
    greaterthan->next=NULL;
    struct ListNode* cur=pHead;
    struct ListNode* next=NULL;
    if(cur)next=cur->next;


  struct ListNode* lesstail=lessthan;
  struct ListNode* greatertail=greaterthan;


    while(cur)
    {
        if(cur->val<x)
        {
            lesstail->next=cur;
            lesstail=cur;

            cur=next;
            if(next)
            next=next->next;
            else
             next=NULL;

             lesstail->next=NULL;

        }
        else {
         greatertail->next=cur;
         greatertail=cur;

         cur=next;
         if(next)
         {
            next=next->next;

         }
         else {
         next=NULL;
         }

         greatertail->next=NULL;

        }
    }

    struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    if(lessthan->next)
    {
        newhead->next=lessthan->next;
        lesstail->next=greaterthan->next;
    }
    else
     newhead->next=greaterthan->next;
  

    return newhead->next;
}
};