Linked List | Set 3 [Deleting a node]
We have discussed Linked List Introduction and Linked List Insertion in previous posts on a singly linked list.
Let us formulate the problem statement to understand the deletion process. Given a ‘key’, delete the first occurrence of this key in the linked list.
Iterative Method:
To delete a node from the linked list, we need to do the following steps.
1] Find the previous node of the node to be deleted.
2] Change the next of the previous node.
3] Free memory for the node to be deleted.
Delete 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->7 Output: Linked List = 8->3->1->7 Input: position = 0, Linked List = 8->2->3->1->7 Output: Linked List = 2->3->1->7Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.
If the node to be deleted is the root, simply delete it. To delete a middle node, we must have a pointer to the node previous to the node to be deleted. So if positions are not zero, we run a loop position-1 times and get a pointer to the previous node.
Below is the implementation of the above idea.
C++
// A complete working C++ program to delete // a node in a linked list at a given position #include using namespace std; // A linked list node class Node { public: int data; Node* next; }; // Given a reference [pointer to pointer] to // the head of a list and an int inserts a // new node on the front of the list. void 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; } // Given a reference [pointer to pointer] to // the head of a list and a position, deletes // the node at the given position void deleteNode[Node** head_ref, int position] { // If linked list is empty if [*head_ref == NULL] return; // Store head node Node* temp = *head_ref; // If head needs to be removed if [position == 0] { // Change head *head_ref = temp->next; // Free old head free[temp]; return; } // Find previous node of the node to be deleted for [int i = 0; temp != NULL && i < position - 1; i++] temp = temp->next; // If position is more than number of nodes if [temp == NULL || temp->next == NULL] return; // Node temp->next is the node to be deleted // Store pointer to the next of node to be deleted Node* next = temp->next->next; // Unlink the node from linked list free[temp->next]; // Free memory // Unlink the deleted node from list temp->next = next; } // This function prints contents of linked // list starting from the given node void printList[Node* node] { while [node != NULL] { cout data next; } } // Driver code int main[] { // Start with the empty list Node* head = NULL; push[&head, 7]; push[&head, 1]; push[&head, 3]; push[&head, 2]; push[&head, 8]; cout next; // Advancing the head pointer temp->next=NULL; free[temp]; // Node is deleted } else { for[i=0;inext; } // Now temp pointer points to the previous node of the node to be deleted struct node *del =temp->next; // del pointer points to the node to be deleted temp->next=temp->next->next; printf["\nElement deleted is : %d\n",del->data]; del->next=NULL; free[del]; // Node is deleted } printf["\nUpdated Linked List is : \n"]; display_List[]; return ; } void insert[int value] { struct node *newnode; // Creating a new node newnode = [struct node *]malloc[sizeof[struct node]]; // Allocating dynamic memory newnode->data = value; // Assigning value to newnode newnode->next = NULL; if[head==NULL] // Checking if List is empty { head = newnode; tail = newnode; } else // If not empty then... { tail->next=newnode; tail=newnode; // Updating the tail node with each insertion } return ; } void display_List[] { struct node *temp; // Creating a temporary pointer to the structure temp=head; // temp points to head; while[temp!=NULL] { if[temp->next==NULL] { printf[" %d->NULL",temp->data]; } else { printf[" %d->",temp->data]; } temp=temp->next; // Traversing the List till end } printf["\n"]; return ; } // --Driver Code-- int main[] { insert[10]; insert[20]; insert[30]; insert[40]; insert[50]; insert[60]; printf["\n--Created Linked List--\n"]; display_List[]; printf["\nLinked List after deletion at position 0"]; delete[0]; // List indexing starts from 0 printf["\nLinked List after deletion at position 2"]; delete[2]; return 0; } // This code is contributed by Sanjeeban Mukhopadhyay. |
Java
// A complete working Java program to delete a node in a // linked list at a given position class LinkedList { Node head; // head of list /* Linked list Node*/ class Node { int data; Node next; Node[int d] { data = d; next = null; } } /* Inserts a new Node at front of the list. */ public void push[int new_data] { /* 1 & 2: Allocate the Node & Put in the data*/ Node new_node = new Node[new_data]; /* 3. Make next of new Node as head */ new_node.next = head; /* 4. Move the head to point to new Node */ head = new_node; } /* Given a reference [pointer to pointer] to the head of a list and a position, deletes the node at the given position */ void deleteNode[int position] { // If linked list is empty if [head == null] return; // Store head node Node temp = head; // If head needs to be removed if [position == 0] { head = temp.next; // Change head return; } // Find previous node of the node to be deleted for [int i = 0; temp != null && i < position - 1; i++] temp = temp.next; // If position is more than number of nodes if [temp == null || temp.next == null] return; // Node temp->next is the node to be deleted // Store pointer to the next of node to be deleted Node next = temp.next.next; temp.next = next; // Unlink the deleted node from list } /* This function prints contents of linked list starting from the given node */ public void printList[] { Node tnode = head; while [tnode != null] { System.out.print[tnode.data + " "]; tnode = tnode.next; } } /* Driver program to test above functions. Ideally this function should be in a separate user class. It is kept here to keep code compact */ public static void main[String[] args] { /* Start with the empty list */ LinkedList llist = new LinkedList[]; llist.push[7]; llist.push[1]; llist.push[3]; llist.push[2]; llist.push[8]; System.out.println["\nCreated Linked list is: "]; llist.printList[]; llist.deleteNode[4]; // Delete node at position 4 System.out.println[ "\nLinked List after Deletion at position 4: "]; llist.printList[]; } } |
Python3
# Python program to delete a node in a linked list # at a given position # Node class class Node: # Constructor to initialize the node object def __init__[self, data]: self.data = data self.next = None class LinkedList: # Constructor to initialize head def __init__[self]: self.head = None # Function to insert a new node at the beginning def push[self, new_data]: new_node = Node[new_data] new_node.next = self.head self.head = new_node # Given a reference to the head of a list # and a position, delete the node at a given position #This delete function code is contributed by Arabin Islam def deleteNode[self, position]: if self.head is None: return if position == 0: self.head = self.head.next return self.head index = 0 current = self.head prev = self.head temp = self.head while current is not None: if index == position: temp = current.next break prev = current current = current.next index += 1 prev.next = temp return prev # Utility function to print the linked LinkedList def printList[self]: temp = self.head while[temp]: print [" %d " % [temp.data],end=" "] temp = temp.next # Driver program to test above function llist = LinkedList[] llist.push[7] llist.push[1] llist.push[3] llist.push[2] llist.push[8] print ["Created Linked List: "] llist.printList[] llist.deleteNode[4] print ["\nLinked List after Deletion at position 4: "] llist.printList[] # This code is contributed by Nikhil Kumar Singh[nickzuck_007] |
C#
// A complete working C# program to delete // a node in a linked list at a given position using System; class GFG { // Head of list Node head; // Linked list Node public class Node { public int data; public Node next; public Node[int d] { data = d; next = null; } } // Inserts a new Node at front of the list. public void Push[int new_data] { /* 1 & 2: Allocate the Node & Put in the data*/ Node new_node = new Node[new_data]; /* 3. Make next of new Node as head */ new_node.next = head; /* 4. Move the head to point to new Node */ head = new_node; } // Given a reference [pointer to pointer] // to the head of a list and a position, // deletes the node at the given position void deleteNode[int position] { // If linked list is empty if [head == null] return; // Store head node Node temp = head; // If head needs to be removed if [position == 0] { // Change head head = temp.next; return; } // Find previous node of the node to be deleted for [int i = 0; temp != null && i < position - 1; i++] temp = temp.next; // If position is more than number of nodes if [temp == null || temp.next == null] return; // Node temp->next is the node to be deleted // Store pointer to the next of node to be deleted Node next = temp.next.next; // Unlink the deleted node from list temp.next = next; } // This function prints contents of // linked list starting from the // given node public void printList[] { Node tnode = head; while [tnode != null] { Console.Write[tnode.data + " "]; tnode = tnode.next; } } // Driver code public static void Main[String[] args] { // Start with the empty list GFG llist = new GFG[]; llist.Push[7]; llist.Push[1]; llist.Push[3]; llist.Push[2]; llist.Push[8]; Console.WriteLine["\nCreated Linked list is: "]; llist.printList[]; // Delete node at position 4 llist.deleteNode[4]; Console.WriteLine["\nLinked List after " + "Deletion at position 4: "]; llist.printList[]; } } // This code is contributed by Rajput-Ji |
Javascript
// A complete working javascript program to // delete a node in a linked list at a // given position // head of list var head; /* Linked list Node */ class Node { constructor[val] { this.data = val; this.next = null; } } /* Inserts a new Node at front of the list. */ function push[new_data] {
/* * 1 & 2: Allocate the Node & Put in the data */ var new_node = new Node[new_data]; /* 3. Make next of new Node as head */ new_node.next = head; /* 4. Move the head to point to new Node */ head = new_node; } /* * Given a reference [pointer to pointer] to the * head of a list and a position, * deletes the node at the given position */ function deleteNode[position] {
// If linked list is empty if [head == null] return;
// Store head node var temp = head;
// If head needs to be removed if [position == 0] {
// Change head head = temp.next; return; }
// Find previous node of the node to be deleted for[i = 0; temp != null && i < position - 1; i++] temp = temp.next;
// If position is more than number of nodes if [temp == null || temp.next == null] return;
// Node temp->next is the node to be deleted // Store pointer to the next of node to be deleted var next = temp.next.next;
// Unlink the deleted node from list temp.next = next; } /* * This function prints contents of linked * list starting from the given node */ function printList[] { var tnode = head; while [tnode != null] { document.write[tnode.data + " "]; tnode = tnode.next; } } /* * Driver program to test above functions. * Ideally this function should be in a * separate user class. It is kept here * to keep code compact */ /* Start with the empty list */ push[7]; push[1]; push[3]; push[2]; push[8];
document.write["Created Linked list is: printList[]; // Delete node at position 4 deleteNode[4];
document.write["
"Deletion at position 4: printList[]; // This code is contributed by todaysgaurav |
Output:
--Created Linked List-- 10-> 20-> 30-> 40-> 50-> 60->NULL Linked List after deletion at position 0 Element deleted is : 10 Updated Linked List is : 20-> 30-> 40-> 50-> 60->NULL Linked List after deletion at position 2 Element deleted is : 40 Updated Linked List is : 20-> 30-> 50-> 60->NULLThanks to Hemanth Kumar for suggesting initial solution. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Article Tags :
Linked List
Samsung
Practice Tags :
Samsung
Linked List
Read Full Article
7.10: Linked List Node Delete
- Last updated
- Save as PDF
- Text Author[s]: Patrick McClanahan
- Associate Professor [Computer Science] at San Joaquin Delta College
\[ \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}}}\] \[ \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{#1}}} \]\[\newcommand{\id}{\mathrm{id}}\] \[ \newcommand{\Span}{\mathrm{span}}\] \[ \newcommand{\kernel}{\mathrm{null}\,}\] \[ \newcommand{\range}{\mathrm{range}\,}\] \[ \newcommand{\RealPart}{\mathrm{Re}}\] \[ \newcommand{\ImaginaryPart}{\mathrm{Im}}\] \[ \newcommand{\Argument}{\mathrm{Arg}}\] \[ \newcommand{\norm}[1]{\| #1 \|}\] \[ \newcommand{\inner}[2]{\langle #1, #2 \rangle}\] \[ \newcommand{\Span}{\mathrm{span}}\] \[\newcommand{\id}{\mathrm{id}}\] \[ \newcommand{\Span}{\mathrm{span}}\] \[ \newcommand{\kernel}{\mathrm{null}\,}\] \[ \newcommand{\range}{\mathrm{range}\,}\] \[ \newcommand{\RealPart}{\mathrm{Re}}\] \[ \newcommand{\ImaginaryPart}{\mathrm{Im}}\] \[ \newcommand{\Argument}{\mathrm{Arg}}\] \[ \newcommand{\norm}[1]{\| #1 \|}\] \[ \newcommand{\inner}[2]{\langle #1, #2 \rangle}\] \[ \newcommand{\Span}{\mathrm{span}}\]
- Delete Node
C program to delete a node from linked list
#include #include /* A structure of linked list node */ struct node { int data; struct node *next; } *head; void initialize[]{ head = NULL; } /* Given a Inserts a node in front of a singly linked list. */ void insert[int num] { /* Create a new Linked List node */ struct node* newNode = [struct node*] malloc[sizeof[struct node]]; newNode->data = num; /* Next pointer of new node will point to head node of linked list */ newNode->next = head; /* make new node as new head of linked list */ head = newNode; printf["Inserted Element : %d\n", num]; } void deleteNode[struct node *head, int num] { struct node *current = head, *previous; /* Input Validation */ if [head == NULL] { printf["Error : Invalid node pointer !!!\n"]; return; } /* If head head node itself contains num, then delete head node and shift head pointer */ if [current->data == num] { head = current->next; free[current]; return; } /* Traverse given linked list and search for key. If found, keep a pointer to previous node also. */ while [current != NULL && current->data != num] { previous = current; current = current->next; } /* num not found in given Linked list */ if [current == NULL]{ printf["%d not found in Linked List\n"]; return; } /* Set next pointer of previous node to next pointer of temp[current node]*/ previous->next = current->next; /* DeAllocate memory of node */ free[current]; } /* Prints a linked list from head node till tail node */ void printLinkedList[struct node *nodePtr] { while [nodePtr != NULL] { printf["%d", nodePtr->data]; nodePtr = nodePtr->next; if[nodePtr != NULL] printf["-->"]; } } int main[] { initialize[]; /* Creating a linked List*/ insert[2]; insert[4]; insert[5]; insert[9]; printf["\nBefore Deletion\n"]; printLinkedList[head]; /* Deleting a node from Linked List */ deleteNode[head, 5]; /* Deleting head node */ deleteNode[head, 2]; printf["\nAfter Deletion\n"]; printLinkedList[head]; return 0; } OutputInserted Element : 2 Inserted Element : 4 Inserted Element : 5 Inserted Element : 9 Before Deletion 9-->5-->4-->2 After Deletion 9-->4