Given a doubly linked list, the task is to delete the last node of the given linked list.
Examples:
Input: 1 <-> 2 <-> 3 <-> NULL
Output: 1 <-> 2 <-> NULL
Explanation: The last node of the linked list is 3, so 3 is deleted.Input: 15 -> NULL
Output: NULL
Explanation: The last node of the linked list is 15, so 15 is deleted.
Approach:
To perform the deletion operation at the end of doubly linked list, we need to traverse the list to find the second last node, then set its next pointer to null.

To delete a node at the end in doubly linked list, we can use the following steps:
- Check if the doubly linked list is empty. If it is empty, then there is nothing to delete.
- If the list is not empty, then move to the last node of the doubly linked list, say curr.
- Update the second-to-last node’s next pointer to NULL, curr->prev->next = NULL.
- Free the memory allocated for the node that was deleted.
// C++ Program to delete a node from the end of Doubly Linked List
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *prev;
Node *next;
Node(int d) {
data = d;
prev = NULL;
next = NULL;
}
};
// Function to delete the last node of the doubly
// linked list
Node *delLast(Node *head) {
// Corner cases
if (head == NULL)
return NULL;
if (head->next == NULL) {
delete head;
return NULL;
}
// Traverse to the last node
Node *curr = head;
while (curr->next != NULL)
curr = curr->next;
// Update the previous node's next pointer
curr->prev->next = NULL;
// Delete the last node
delete curr;
// Return the updated head
return head;
}
void printList(Node *head) {
Node *curr = head;
while (curr != NULL) {
cout << curr->data << " ";
curr = curr->next;
}
cout << endl;
}
int main() {
// Create a hardcoded doubly linked list:
// 1 <-> 2 <-> 3
struct Node *head = new Node(1);
head->next = new Node(2);
head->next->prev = head;
head->next->next = new Node(3);
head->next->next->prev = head->next;
printf("Original Linked List: ");
printList(head);
printf("After Deletion at the end: ");
head = delLast(head);
printList(head);
return 0;
}
// C Program to delete a node from the end of Doubly Linked List
#include <stdio.h>
struct Node {
int data;
struct Node* prev;
struct Node* next;
};
// Function to delete the last node of the doubly linked list
struct Node* delLast(struct Node *head) {
// Corner cases
if (head == NULL)
return NULL;
if (head->next == NULL) {
free(head);
return NULL;
}
// Traverse to the last node
struct Node *curr = head;
while (curr->next != NULL)
curr = curr->next;
// Update the previous node's next pointer
curr->prev->next = NULL;
// Delete the last node
free(curr);
// Return the updated head
return head;
}
// Function to print the list
void printList(struct Node *head) {
struct Node *curr = head;
while (curr != NULL) {
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n");
}
// Function to create a new node
struct Node* createNode(int data) {
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
int main() {
// Create a hardcoded doubly linked list:
// 1 <-> 2 <-> 3
struct Node *head = createNode(1);
head->next = createNode(2);
head->next->prev = head;
head->next->next = createNode(3);
head->next->next->prev = head->next;
printf("Original Linked List: ");
printList(head);
printf("After Deletion at the end: ");
head = delLast(head);
printList(head);
return 0;
}
// Java Program to delete a node from the end of Doubly Linked List
class Node {
int data;
Node prev;
Node next;
Node(int data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
public class GFG {
// Function to delete the last node of the doubly linked list
public static Node delLast(Node head) {
// Corner cases
if (head == null) {
return null;
}
if (head.next == null) {
return null;
}
// Traverse to the last node
Node curr = head;
while (curr.next != null) {
curr = curr.next;
}
// Update the previous node's next pointer
if (curr.prev != null) {
curr.prev.next = null;
}
// Return the updated head
return head;
}
// Function to print the list
public static void printList(Node head) {
Node curr = head;
while (curr != null) {
System.out.print(curr.data + " ");
curr = curr.next;
}
System.out.println();
}
public static void main(String[] args) {
// Create a hardcoded doubly linked list:
// 1 <-> 2 <-> 3
Node head = new Node(1);
head.next = new Node(2);
head.next.prev = head;
head.next.next = new Node(3);
head.next.next.prev = head.next;
System.out.print("Original Linked List: ");
printList(head);
System.out.print("After Deletion at the end: ");
head = delLast(head);
printList(head);
}
}
# Python Program to delete a node from the end of Doubly Linked List
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
def del_last(head):
# Corner cases
if head is None:
return None
if head.next is None:
return None
# Traverse to the last node
curr = head
while curr.next is not None:
curr = curr.next
# Update the previous node's next pointer
if curr.prev is not None:
curr.prev.next = None
# Return the updated head
return head
def print_list(head):
curr = head
while curr is not None:
print(curr.data, end=" ")
curr = curr.next
print()
if __name__ == "__main__":
# Create a hardcoded doubly linked list:
# 1 <-> 2 <-> 3
head = Node(1)
head.next = Node(2)
head.next.prev = head
head.next.next = Node(3)
head.next.next.prev = head.next
print("Original Linked List: ", end="")
print_list(head)
print("After Deletion at the end: ", end="")
head = del_last(head)
print_list(head)
// C# Program to delete a node from the end of Doubly Linked List
using System;
class Node {
public int Data;
public Node Prev;
public Node Next;
public Node(int data) {
Data = data;
Prev = null;
Next = null;
}
}
class GFG {
// Function to delete the last node of the doubly linked list
static Node DelLast(Node head) {
// Corner cases
if (head == null)
return null;
if (head.Next == null) {
return null;
}
// Traverse to the last node
Node curr = head;
while (curr.Next != null)
curr = curr.Next;
// Update the previous node's next pointer
if (curr.Prev != null)
curr.Prev.Next = null;
// Delete the last node
curr = null;
// Return the updated head
return head;
}
// Function to print the list
static void PrintList(Node head) {
Node curr = head;
while (curr != null) {
Console.Write(curr.Data + " ");
curr = curr.Next;
}
Console.WriteLine();
}
static void Main() {
// Create a hardcoded doubly linked list:
// 1 <-> 2 <-> 3
Node head = new Node(1);
head.Next = new Node(2);
head.Next.Prev = head;
head.Next.Next = new Node(3);
head.Next.Next.Prev = head.Next;
Console.Write("Original Linked List: ");
PrintList(head);
Console.Write("After Deletion at the end: ");
head = DelLast(head);
PrintList(head);
}
}
// JavaScript Program to delete a node from the end of Doubly Linked List
class Node {
constructor(data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
// Function to delete the last node of the doubly linked list
function delLast(head) {
// Corner cases
if (head === null) return null;
if (head.next === null) {
// Only one node in the list
return null;
}
// Traverse to the last node
let curr = head;
while (curr.next !== null) {
curr = curr.next;
}
// Update the previous node's next pointer
if (curr.prev !== null) {
curr.prev.next = null;
}
// Node curr is now deleted (garbage collected in JS)
return head;
}
// Function to print the list
function printList(head) {
let curr = head;
while (curr !== null) {
console.log(curr.data + " ");
curr = curr.next;
}
}
// Create a hardcoded doubly linked list:
// 1 <-> 2 <-> 3
let head = new Node(1);
head.next = new Node(2);
head.next.prev = head;
head.next.next = new Node(3);
head.next.next.prev = head.next;
console.log("Original Linked List:");
printList(head);
console.log("After Deletion at the end:");
head = delLast(head);
printList(head);
Output
Original Linked List: 1 2 3 After Deletion at the end: 1 2
Time Complexity: O(N), where N is the number of nodes in the linked list
Auxiliary Space: O(1)