Javascript Program For Rearranging A Given Linked List In-Place
Last Updated : 05 May, 2025
Given a singly linked list L0 -> L1 -> … -> Ln-1 -> Ln. Rearrange the nodes in the list so that the new formed list is : L0 -> Ln -> L1 -> Ln-1 -> L2 -> Ln-2 ...
You are required to do this in place without altering the nodes' values.
Examples:
Input: 1 -> 2 -> 3 -> 4
Output: 1 -> 4 -> 2 -> 3
Input: 1 -> 2 -> 3 -> 4 -> 5
Output: 1 -> 5 -> 2 -> 4 -> 3
Simple Solution:
1) Initialize current node as head.
2) While next of current node is not null, do following
a) Find the last node, remove it from the end and insert it as next
of the current node.
b) Move current to next to next of current
The time complexity of the above simple solution is O(n2) where n is the number of nodes in the linked list.
Better Solution:
- Copy contents of the given linked list to a vector.
- Rearrange the given vector by swapping nodes from both ends.
- Copy the modified vector back to the linked list.
Efficient Solution:
1) Find the middle point using tortoise and hare method.
2) Split the linked list into two halves using found middle point in step 1.
3) Reverse the second half.
4) Do alternate merge of first and second halves.
The Time Complexity of this solution is O(n).
Below is the implementation of this method.
JavaScript // Javascript program to rearrange // linked list in place // Linked List Class // Head of the list let head; // Node Class class Node { // Constructor to create // a new node constructor(d) { this.data = d; this.next = null; } } function printlist(node) { if (node == null) { return; } while (node != null) { console.log(node.data); node = node.next; } } function reverselist(node) { let prev = null, curr = node, next; while (curr != null) { next = curr.next; curr.next = prev; prev = curr; curr = next; } node = prev; return node; } function rearrange(node) { // 1) Find the middle point using // tortoise and hare method let slow = node, fast = slow.next; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } // 2) Split the linked list in // two halves // node1, head of first half // 1 -> 2 -> 3 // node2, head of second half // 4 -> 5 let node1 = node; let node2 = slow.next; slow.next = null; // 3) Reverse the second half, // i.e., 5 -> 4 node2 = reverselist(node2); // 4) Merge alternate nodes // Assign dummy Node node = new Node(0); // curr is the pointer to this // dummy Node, which will be // used to form the new list let curr = node; while (node1 != null || node2 != null) { // First add the element from // first list if (node1 != null) { curr.next = node1; curr = curr.next; node1 = node1.next; } // Then add the element from // second list if (node2 != null) { curr.next = node2; curr = curr.next; node2 = node2.next; } } // Assign the head of the new // list to head pointer node = node.next; } head = new Node(1); head.next = new Node(2); head.next.next = new Node(3); head.next.next.next = new Node(4); head.next.next.next.next = new Node(5); // Print original list console.log("Original Linked List"); printlist(head); // Rearrange list as per ques console.log("Rearrange Linked List"); rearrange(head); // Print modified list printlist(head); // This code is contributed by gauravrajput1
OutputOriginal Linked List 1 2 3 4 5 Rearrange Linked List 1 5 2 4 3
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(1)
Thanks to Gaurav Ahirwar for suggesting the above approach.
Another approach:
1. Take two pointers prev and curr, which hold the addresses of head and head-> next.
2. Compare their data and swap.
After that, a new linked list is formed.
Below is the implementation:
JavaScript // Javascript code to rearrange linked list // in place class Node { constructor() { this.data; this.next = null; } } // Function for rearranging a linked list // with high and low value. function rearrange(head) { // Base case if (head == null) return null; // Two pointer variable. let prev = head, curr = head.next; while (curr != null) { // Swap function for swapping data. if (prev.data > curr.data) { let t = prev.data; prev.data = curr.data; curr.data = t; } // Swap function for swapping data if (curr.next != null && curr.next.data > curr.data) { let t = curr.next.data; curr.next.data = curr.data; curr.data = t; } prev = curr.next; if (curr.next == null) break; curr = curr.next.next; } return head; } // Function to display Node // of linked list. function display(head) { let curr = head; while (curr != null) { console.log(curr.data); curr = curr.next; } } // Function to insert a Node in // the linked list at the beginning. function push(head, k) { let tem = new Node(); tem.data = k; tem.next = head; head = tem; return head; } // Driver code let head = null; head = push(head, 7); head = push(head, 3); head = push(head, 8); head = push(head, 6); head = push(head, 9); head = rearrange(head); display(head); // This code is contributed by unknown2108
Complexity Analysis:
- Time Complexity : O(n)
- Auxiliary Space : O(1)
Another Approach: (Using recursion)
- Hold a pointer to the head node and go till the last node using recursion
- Once the last node is reached, start swapping the last node to the next of head node
- Move the head pointer to the next node
- Repeat this until the head and the last node meet or come adjacent to each other
- Once the Stop condition met, we need to discard the left nodes to fix the loop created in the list while swapping nodes.
JavaScript // Javascript program to implement // the above approach // Creating the structure for node class Node { // Function to create newNode // in a linkedlist constructor(val) { this.data = val; this.next = null; } } letleft = null; // Function to print the list function printlist(head) { while (head != null) { console.log(head.data); if (head.next != null) { } head = head.next; } } // Function to rearrange function rearrange(head) { if (head != null) { left = head; reorderListUtil(left); } } function reorderListUtil(right) { if (right == null) { return; } reorderListUtil(right.next); // We set left = null, when we reach // stop condition, so no processing // required after that if (left == null) { return; } // Stop condition: odd case : // left = right, even // case : left.next = right if (left != right && left.next != right) { let temp = left.next; left.next = right; right.next = temp; left = temp; } else { // Stop condition , set null // to left nodes if (left.next == right) { // even case left.next.next = null; left = null; } else { // odd case left.next = null; left = null; } } } // Drivers Code let head = new Node(1); head.next = new Node(2); head.next.next = new Node(3); head.next.next.next = new Node(4); head.next.next.next.next = new Node(5); // Print original list console.log("Original Linked List: "); printlist(head); // Modify the list console.log("Rearranged Linked List: "); rearrange(head); // Print modified list printlist(head); // This code is contributed by aashish1995
OutputOriginal Linked List: 1 2 3 4 5 Rearranged Linked List: 1 5 2 4 3
Complexity Analysis:
- Time Complexity: O(n), where n represents the length of the given linked list.
- Auxiliary Space: O(n), due to recursive call stack where n represents the length of the given linked list.
Similar Reads
JavaScript Linked List Programs
JavaScript Linked List Programs contain a list of articles based on programming. Linked List is a linear data structure that stores data in linearly connected nodes. Linked lists store elements sequentially, but doesnât store the elements contiguously like an array. S. NoArticles1JavaScript Program
5 min read
Implementation of LinkedList in Javascript
In this article, we will be implementing the LinkedList data structure in Javascript. A linked list is a linear data structure where elements are stored in nodes, each containing a value and a reference (or pointer) to the next node. It allows for efficient insertion and deletion operations. Each no
5 min read
Javascript Program For Searching An Element In A Linked List
Write a function that searches a given key 'x' in a given singly linked list. The function should return true if x is present in linked list and false otherwise. bool search(Node *head, int x) For example, if the key to be searched is 15 and linked list is 14->21->11->30->10, then functi
3 min read
Javascript Program For Inserting A Node In A Linked List
We have introduced Linked Lists in the previous post. We also created a simple linked list with 3 nodes and discussed linked list traversal.All programs discussed in this post consider the following representations of the linked list. [GFGTABS] JavaScript // Linked List Class // Head of list let he
7 min read
Javascript Program For Inserting Node In The Middle Of The Linked List
Given a linked list containing n nodes. The problem is to insert a new node with data x at the middle of the list. If n is even, then insert the new node after the (n/2)th node, else insert the new node after the (n+1)/2th node. Examples: Input : list: 1->2->4->5 x = 3Output : 1->2->3
4 min read
Javascript Program For Writing A Function To Delete A Linked List
A linked list is a linear data structure, in which the elements are not stored at contiguous memory locations. The elements in a linked list are linked using pointers. This article focuses on writing a function to delete a linked list. Implementation: [GFGTABS] JavaScript // Javascript program to de
2 min read
Javascript Program For Deleting A Linked List Node At A Given Position
Given a singly linked list and a position, delete a linked list node at the given position. Example: Input: position = 1, Linked List = 8->2->3->1->7Output: Linked List = 8->3->1->7Input: position = 0, Linked List = 8->2->3->1->7Output: Linked List = 2->3->1-
3 min read
Javascript Program For Finding Length Of A Linked List
Write a function to count the number of nodes in a given singly linked list. For example, the function should return 5 for linked list 1->3->1->2->1. Iterative Solution: 1) Initialize count as 0 2) Initialize a node pointer, current = head.3) Do following while current is not NULL a) cur
3 min read
Javascript Program For Rotating A Linked List
Given a singly linked list, rotate the linked list counter-clockwise by k nodes. Where k is a given positive integer. For example, if the given linked list is 10->20->30->40->50->60 and k is 4, the list should be modified to 50->60->10->20->30->40. Assume that k is smal
5 min read
Javascript Program For Making Middle Node Head In A Linked List
Given a singly linked list, find middle of the linked list and set middle node of the linked list at beginning of the linked list. Examples: Input: 1 2 3 4 5 Output: 3 1 2 4 5Input: 1 2 3 4 5 6Output: 4 1 2 3 5 6 The idea is to first find middle of a linked list using two pointers, first one moves o
3 min read