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