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
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--; }
This comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteCompiles but doesn't give correct result on my compiler -- code blocks.
ReplyDeleteReplace 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