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--;
}

5 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. This comment has been removed by the author.

    ReplyDelete
  4. This comment has been removed by the author.

    ReplyDelete
  5. Compiles but doesn't give correct result on my compiler -- code blocks.
    Replace l.insert(it, nl.front()); with

    it = l.insert(it, nl.front());
    it++;
    if(it != l.end())
    it++;

    Good idea though. Thanks for the posting.

    Paul

    ReplyDelete