C++ Programming - Split Linked List into Two

Given a linked list



We have to split it into two. One of the obvious way is to traverse the linked list once get the count and terminating at the midpoint. But it will be of the order n + n/2. Another solution is to add intermediate elements into another linked list which will be of the order n.




Here is the solution (C++):



template class node {
T val;
node *nxt;
public:
node(T v): val(v), nxt(NULL) {}
node(T v, node *n): val(v), nxt(n) {}

T& operator()()
{
return val;
}

node *next()
{
return nxt;
}

void next(node *n)
{
nxt = n;
}

T& operator==(T v)
{
val = v;
}
};

template class Util
{
public:
static node *insert(node **begin, int value)
{
node *me = new node(value);

if ( (me == NULL) || (begin == NULL))
return me;

if ( *begin == NULL )
*begin = me;
else
last(*begin)->next(me);

return me;
}

static bool remove(node **begin, int value)
{
if ( (begin == NULL) || (*begin == NULL))
return false;

node *me = *begin, *prev = NULL;

while(me) {
if ( (*me)() == value )
break;
prev = me;
me = me->next();

}

if ( *begin == me )
*begin = me->next();

if ( prev && me )
prev->next(me->next());

delete me;

return (me != NULL);
}

static node find(node *me, int value)
{
while(me) {
if ( (*me)() == value )
break;
me = me->next();
}
return me;
}

static node *split(node *me)
{
if ( (me == NULL) || (me->next() == NULL))
return NULL;

node *nme = me->next();

node *sec = nme;

while(nme) {
me->next(nme->next());

me = nme;
nme = nme->next();
}

return sec;
}

static void print(node *me)
{
while(me) {
std::cout << (*me)();
me = me->next();
if ( me ) std::cout << " -> ";
}
std::cout << "--|" << std::endl;
}

static node* last(node *begin)
{
node *theone = NULL;
if (begin == NULL) return theone;

theone = begin;
while(theone->next() != NULL)
{
theone = theone->next();
}

return theone;
}
};

int main()
{
node *first = NULL;
int input[] = { 1,2,3,4,5,6,7};

for(int i = 0 ; i < sizeof(input)/sizeof(input[0]); ++i)
Util::insert(&first,input[i]);

std::cout << "Input: " << std::endl;
Util::print(first);

node *second = Util::split(first);

std::cout << "Output: " << std::endl;
Util::print(first);
Util::print(second);
}


Labels: ,

Posted by - at 11:02 am | 2 comments read on

Archives

  • May 2011
  • February 2009
  • December 2008
  • November 2008
  • October 2008
  • August 2008
  • April 2008
  • December 2007
  • November 2007
  • January 2007
  • December 2006
  • October 2006
  • September 2006
  • June 2006
  • May 2006
  • April 2006
  • March 2006
  • February 2006
  • January 2006
  • December 2005
  • November 2005
  • October 2005

Links