Saturday, February 1, 2014

Zip of a linked list


Given a linked list <1, 2, 3, 4, 5, 6>, zip of this linked list is defined as 1, 6 , 2, 5 , 3, 4. And the task is to achieve desired linked list using O(1) space.
This can be performed by a simple algorithm:
  • Split the list from the middle into two lists. We are splitting the list into two and not creating a new linked list hence maintaining O(1) space
  • Now we have two lists : 1, 2, 3 and 4, 5, 6. Reverse the second list
  • This gives us two lists 1, 2, 3 and 6, 5, 4
  • Now merge the lists picking one node from each list as a time
Below is how we can do the same using STL lists.

list<int> l; //original list
list<int> nl; //new empty list
int size = l.size();

//Step 1 of splitting into two
for(int i = 0 ; i < size/2; i++)
{
    nl.push_back(l.back());
    l.pop_back();
}

//At this point we have 1, 2, 3 and 6, 5, 4
size = l.size();
list<int>::iterator it = l.begin();
it++;
while(i)
{
    l.insert(it, nl.front());
    nl.pop_front();
    i--;
}