Learn how to create an algorithm to reverse sublist of linked list.
Given a linked list and two range m and n we have to reverse all the elements between this range.
Example
Input: 1 -> 2 -> 3 -> 4 -> 5 -> null m = 2, n = 4 Output: 1 -> 4 -> 3 -> 2 -> 5 -> null
Note here the index starts from 1 unlike in array where it starts from 0 and we have to perform this in one go.
Reverse sublist of linked list in a given range.
Conceptually this is how our algorithm will work
- Iterate till the last range.
- Store the previous elements from where the reverse index starts.
- Reverse the elements in the given range.
- Mark the remaining elements as the next of reversed sublist.
- Then add this reversed sublist to the previous elements.
We can break the above examples as
- Prev elements:
1 -> next
. - Reversed sublist:
4 -> 3 -> 2 -> next
. - Remaining list:
5 -> null
.
At the end merge them 1 -> 4 -> 3 -> 2 -> 5 -> null
. Its done.
const reverseBetween = (head, m, n) => { //If same then return the head if (m === n) { return head; } let index = 1; //To track list let current = head; //To reverse elements let previous = null, next = null; //To track elements before reversing let reverse_prev = null; //Iterate till we have to reverse while (current && index <= n) { //If element is in the range //Reverse them if (index >= m && index <= n) { previous = current; current = current.next; previous.next = next; next = previous; } else { //Store the elements before reverseing starts reverse_prev = current; current = current.next; } index++; } //If there are previous elements //Then mark the reversed elements as its next if (reverse_prev) { reverse_prev.next = next; } else { //Else whole list is reversed so return it reverse_prev = head = next; } //If there are still elements left after reverse range //Add them after the reversed sublist if (current) { while (reverse_prev.next) { reverse_prev = reverse_prev.next; } reverse_prev.next = current; } //Return the head return head; };
Input: const ll1 = new linkedlist(); ll1.append(1); ll1.append(2); ll1.append(3); ll1.append(4); ll1.append(5); let s = reverseBetween(ll1.getHead(), 2, 3); while (s) { console.log(s.element); s = s.next; } Output: 1 3 2 4 5
Time compleixty: O(max(n, (n - m)));
Space compleixty: O(1).