Given a singly linked list, delete the middle of the linked list. For example, if the given linked list is 1->2->3->4->5 then the linked list should be modified to 1->2->4->5
If there are even nodes, then there would be two middle nodes, we need to delete the second middle element. For example, if given linked list is 1->2->3->4->5->6 then it should be modified to 1->2->3->5->6.
If the input linked list is NULL, then it should remain NULL.
If the input linked list has 1 node, then this node should be deleted and a new head should be returned.
Efficient solution:
Approach: The above solution requires two traversals of the linked list. The middle node can be deleted using one traversal. The idea is to use two pointers, slow_ptr, and fast_ptr. Both pointers start from the head of list. When fast_ptr reaches the end, slow_ptr reaches middle. This idea is same as the one used in method 2 of this post. The additional thing in this post is to keep track of the previous middle so the middle node can be deleted.
Below is the implementation.
Javascript
<script> // Javascript program to delete the // middle of a linked list // Link list Node class Node { constructor() { this .data = 0; this .next = null ; } } // Deletes middle node and returns // head of the modified list function deleteMid( head) { // Base cases if (head == null ) return null ; if (head.next == null ) { return null ; } // Initialize slow and fast pointers // to reach middle of linked list var slow_ptr = head; var fast_ptr = head; // Find the middle and previous of // middle. var prev = null ; // To store previous of slow_ptr while (fast_ptr != null && fast_ptr.next != null ) { fast_ptr = fast_ptr.next.next; prev = slow_ptr; slow_ptr = slow_ptr.next; } // Delete the middle node prev.next = slow_ptr.next; return head; } // A utility function to print // a given linked list function printList(ptr) { while (ptr != null ) { document.write(ptr.data + "->" ); ptr = ptr.next; } document.write( "NULL<br/>" ); } // Utility function to create a // new node. function newNode(data) { temp = new Node(); temp.data = data; temp.next = null ; return temp; } // Driver code // Start with the empty list head = newNode(1); head.next = newNode(2); head.next.next = newNode(3); head.next.next.next = newNode(4); document.write( "Given Linked List<br/>" ); printList(head); head = deleteMid(head); document.write( "Linked List after deletion of middle<br/>" ); printList(head); // This code is contributed by umadevi9616 </script> |
Output:
Given Linked List 1->2->3->4->NULL Linked List after deletion of middle 1->2->4->NULL
Complexity Analysis:
- Time Complexity: O(n).
Only one traversal of the linked list is needed - Auxiliary Space: O(1).
As no extra space is needed.
Please refer complete article on Delete middle of linked list for more details!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!