Given a singly linked list, the task is to remove all the nodes which have a lesser value on left side.
Examples:
Input: 12->15->10->11->5->6->2->3
Output: Modified Linked List = 12 -> 10 -> 5 -> 2Input: 25->15->6->48->12->5->16->14
Output: Modified Linked List = 25 -> 15 -> 6 -> 5
Approach:
- Initialise a variable maximum with head node.
- Traverse the list.
- Check if the next node is lesser than max_node. If yes, move to the next node.
- Else If not, then update the value of max_node and delete the next node.
Below is the implementation of above approach:
// C++ implementation of above approach #include <bits/stdc++.h> using namespace std;
// Structure of a linked list node struct Node {
int data;
struct Node* next;
}; // Function to Delete nodes which have // greater value node(s) on right side void delNodes( struct Node* head)
{ struct Node* current = head;
// Initialize max
struct Node* maxnode = head;
struct Node* temp;
while (current != NULL && current->next != NULL) {
// If current is greater than max,
// then update max and move current
if (current->next->data <= maxnode->data) {
current = current->next;
maxnode = current;
}
// If current is smaller than max, then delete current
else {
temp = current->next;
current->next = temp->next;
free (temp);
}
}
} /* Utility function to insert a node at the beginning */ void push( struct Node** head_ref, int new_data)
{ struct Node* new_node = new Node;
new_node->data = new_data;
new_node->next = *head_ref;
*head_ref = new_node;
} /* Utility function to print a linked list */ void printList( struct Node* head)
{ while (head != NULL) {
cout << head->data << " " ;
head = head->next;
}
cout << endl;
} /* Driver program to test above functions */ int main()
{ struct Node* head = NULL;
/* Create following linked list
12->15->10->11->5->6->2->3 */
push(&head, 3);
push(&head, 2);
push(&head, 6);
push(&head, 5);
push(&head, 11);
push(&head, 10);
push(&head, 15);
push(&head, 12);
printf ( "Given Linked List: " );
printList(head);
delNodes(head);
printf ( "\nModified Linked List: " );
printList(head);
return 0;
} |
// Java implementation of above approach class Solution
{ // Structure of a linked list node static class Node
{ int data;
Node next;
}; // Function to Delete nodes which have // greater value node(s) on right side static Node delNodes(Node head)
{ Node current = head;
// Initialize max
Node maxnode = head;
Node temp;
while (current != null && current.next != null )
{
// If current is lesser than max,
// then update max and move current
if (current.next.data <= maxnode.data)
{
current = current.next;
maxnode = current;
}
// If current is greater than max, then delete current
else
{
temp = current.next;
current.next = temp.next;
}
}
return head;
} // Utility function to insert a node at the beginning / static Node push(Node head_ref, int new_data)
{ Node new_node = new Node();
new_node.data = new_data;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
} // Utility function to print a linked list / static Node printList(Node head)
{ while (head != null )
{
System.out.print( head.data + " " );
head = head.next;
}
System.out.println();
return head;
} // Driver program to test above functions / public static void main(String args[])
{ Node head = null ;
/* Create following linked list
12->15->10->11->5->6->2->3 */
head=push(head, 3 );
head=push(head, 2 );
head=push(head, 6 );
head=push(head, 5 );
head=push(head, 11 );
head=push(head, 10 );
head=push(head, 15 );
head=push(head, 12 );
System.out.printf( "Given Linked List \n" );
printList(head);
head=delNodes(head);
System.out.printf( "Modified Linked List \n" );
printList(head);
} } // This code is contributed by Arnab Kundu |
# Python implementation of above approach import math
# Structure of a linked list node class Node:
def __init__( self , data):
self .data = data
self . next = None
# Function to Delete nodes which have # greater value node(s) on right side def delNodes(head):
current = head
# Initialize max
maxnode = head
temp = None
while (current ! = None and current. next ! = None ):
# If current is greater than max,
# then update max and move current
if (current. next .data < = maxnode.data):
current = current. next
maxnode = current
# If current is smaller than max,
# then delete current
else :
temp = current. next
current. next = temp. next
#free(temp)
# Utility function to insert a node at the beginning def push(head_ref, new_data):
new_node = Node(new_data)
new_node.data = new_data
new_node. next = head_ref
head_ref = new_node
return head_ref
# Utility function to print a linked list def printList(head):
while (head ! = None ) :
print (head.data, end = " " )
head = head. next
print ()
# Driver Code if __name__ = = '__main__' :
head = None
# Create following linked list
# 12.15.10.11.5.6.2.3
head = push(head, 3 )
head = push(head, 2 )
head = push(head, 6 )
head = push(head, 5 )
head = push(head, 11 )
head = push(head, 10 )
head = push(head, 15 )
head = push(head, 12 )
print ( "Given Linked List: " , end = "")
printList(head)
delNodes(head)
print ( "\nModified Linked List: " , end = "")
printList(head)
# This code is contributed by AbhiThakur |
// C# implementation of the above approach: using System;
class GFG
{ // Structure of a linked list node public class Node
{ public int data;
public Node next;
}; // Function to Delete nodes which have // greater value node(s) on right side static Node delNodes(Node head)
{ Node current = head;
// Initialize max
Node maxnode = head;
Node temp;
while (current != null &&
current.next != null )
{
// If current is lesser than max,
// then update max and move current
if (current.next.data <= maxnode.data)
{
current = current.next;
maxnode = current;
}
// If current is greater than max,
// then delete current
else
{
temp = current.next;
current.next = temp.next;
}
}
return head;
} // Utility function to insert // a node at the beginning static Node push(Node head_ref,
int new_data)
{ Node new_node = new Node();
new_node.data = new_data;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
} // Utility function to print a linked list static Node printList(Node head)
{ while (head != null )
{
Console.Write(head.data + " " );
head = head.next;
}
Console.WriteLine();
return head;
} // Driver Code public static void Main(String []args)
{ Node head = null ;
/* Create following linked list
12->15->10->11->5->6->2->3 */
head = push(head, 3);
head = push(head, 2);
head = push(head, 6);
head = push(head, 5);
head = push(head, 11);
head = push(head, 10);
head = push(head, 15);
head = push(head, 12);
Console.Write( "Given Linked List \n" );
printList(head);
head = delNodes(head);
Console.Write( "Modified Linked List \n" );
printList(head);
} } // This code is contributed by PrinciRaj1992 |
<script> // JavaScript implementation of above approach // Structure of a linked list node
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
// Function to Delete nodes which have
// greater value node(s) on right side
function delNodes(head) {
var current = head;
// Initialize max
var maxnode = head;
var temp;
while (current != null && current.next != null ) {
// If current is lesser than max,
// then update max and move current
if (current.next.data <= maxnode.data) {
current = current.next;
maxnode = current;
}
// If current is greater than max,
// then delete current
else {
temp = current.next;
current.next = temp.next;
}
}
return head;
}
// Utility function to insert a
// node at the beginning /
function push(head_ref , new_data) {
var new_node = new Node();
new_node.data = new_data;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
// Utility function to print a linked list /
function printList(head) {
while (head != null ) {
document.write(head.data + " " );
head = head.next;
}
document.write();
return head;
}
// Driver program to test above functions /
var head = null ;
/*
* Create following linked list
12->15->10->11->5->6->2->3
*/
head = push(head, 3);
head = push(head, 2);
head = push(head, 6);
head = push(head, 5);
head = push(head, 11);
head = push(head, 10);
head = push(head, 15);
head = push(head, 12);
document.write( "Given Linked List " );
printList(head);
head = delNodes(head);
document.write( "<br/><br/>Modified Linked List " );
printList(head);
// This code contributed by umadevi9616 </script> |
Given Linked List: 12 15 10 11 5 6 2 3 Modified Linked List: 12 10 5 2
Time Complexity: O(N), since one traversal of the linked List is required to complete all operations hence the overall time required by the algorithm is linear
Auxiliary Space: O(1) , since no extra array is used the space taken by the algorithm is constant