Reverse a Doubly Linked List by swapping data
Last Updated :
16 Dec, 2022
Given a Doubly Linked List, we are asked to reverse the list in place without using any extra space.
Examples:
Input : 1 <--> 2 <--> 5 <--> 6 <--> 7
Output : 7 <--> 6 <--> 5 <--> 2 <--> 1
Input : 11 <--> 22 <--> 33 <--> 22 <--> 1
Output : 1 <--> 22 <--> 33 <--> 22 <--> 11
We have discussed three methods to reverse a doubly-linked list: Reverse a doubly-linked list, Reverse a Doubly Linked List (Set 2) and Reverse a Doubly linked list using recursion.
The first two methods work in O(n) time and require no extra space. The first method works by swapping the next and previous pointers of each node. The second method takes each node from the list and adds it to the beginning of the list.
There is another approach that is a bit more intuitive, but also a bit more costly.
This method is similar to the reverse array. To reverse an array, we put two pointers-one at the beginning and another at the end of the list. We then swap the data of the two pointers and advance both pointers toward each other. We stop either when the two pointers meet or when they cross each other. We perform exactly n/2 swaps, and the time complexity is also O(N).
A doubly linked list has both a previous and a next pointer, which means we can traverse in both forward and backward directions in the list. So if we put a pointer( say left pointer) at the beginning of the list and another right pointer at the end of the list, we can move these pointers toward each other by advancing the left pointer and receding the right pointer.
Algorithm:
Step 1: Set LEFT to head of list
Step 2: Traverse the list and set RIGHT to end of the list
Step 3: Repeat following steps while LEFT != RIGHT and
LEFT->PREV != RIGHT
Step 4: Swap LEFT->DATA and RIGHT->DATA
Step 5: Advance LEFT pointer by one, LEFT = LEFT->NEXT
Step 6: Recede RIGHT pointer by one, i.e RIGHT = RIGHT->PREV
[END OF LOOP]
Step 7: End
A Note on the comparative efficiency of the three methods
A few things must be mentioned. This method is simple to implement, but it is also more costly when compared to the pointer-exchange method. This is because we swap data and not pointers. Swapping data can be more costly if the nodes are large complex data types with multiple data members. In contrast, the pointer to the node will always be a simpler data type and either 4 or 8 bytes.
Below is the implementation of the algorithm.
C++
// Cpp Program to Reverse a List using Data Swapping
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node *prev, *next;
};
Node* newNode(int val)
{
Node* temp = new Node;
temp->data = val;
temp->prev = temp->next = nullptr;
return temp;
}
void printList(Node* head)
{
while (head->next != nullptr) {
cout << head->data << " <--> ";
head = head->next;
}
cout << head->data << endl;
}
// Insert a new node at the head of the list
void insert(Node** head, int val)
{
Node* temp = newNode(val);
temp->next = *head;
(*head)->prev = temp;
(*head) = temp;
}
// Function to reverse the list
void reverseList(Node** head)
{
Node* left = *head, * right = *head;
// Traverse the list and set right pointer to
// end of list
while (right->next != nullptr)
right = right->next;
// Swap data of left and right pointer and move
// them towards each other until they meet or
// cross each other
while (left != right && left->prev != right) {
// Swap data of left and right pointer
swap(left->data, right->data);
// Advance left pointer
left = left->next;
// Advance right pointer
right = right->prev;
}
}
// Driver code
int main()
{
Node* head = newNode(5);
insert(&head, 4);
insert(&head, 3);
insert(&head, 2);
insert(&head, 1);
printList(head);
cout << "List After Reversing" << endl;
reverseList(&head);
printList(head);
return 0;
}
C
// C Program to Reverse a List using Data Swapping
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* prev;
struct Node* next;
};
// Insert a new node at the head of the list
void insert(struct Node** head, int val)
{
struct Node* temp;
temp = (struct Node*)malloc(sizeof(struct Node));
temp->data = val;
temp->next = *head;
temp->prev = NULL;
if ((*head) != NULL) {
(*head)->prev = temp;
}
(*head) = temp;
}
void printList(struct Node* head)
{
struct Node* temp = head;
while (temp->next != NULL) {
printf("%d <--> ", temp->data);
temp = temp->next;
}
printf("%d\n", temp->data);
}
// Function to reverse the list
void reverseList(struct Node* head)
{
struct Node* left = head;
struct Node* right = head;
// Traverse the list and set right pointer to
// end of list
while (right->next != NULL) {
right = right->next;
}
// Swap data of left and right pointer and move
// them towards each other until they meet or
// cross each other
while (left != right && left->prev != right) {
// Swap data of left and right pointer
int temp = left->data;
left->data = right->data;
right->data = temp;
// Advance left pointer
left = left->next;
// Advance right pointer
right = right->prev;
}
}
int main()
{
// code
struct Node* head = NULL;
insert(&head, 5);
insert(&head, 4);
insert(&head, 3);
insert(&head, 2);
insert(&head, 1);
printList(head);
printf("List After Reversing\n");
reverseList(head);
printList(head);
return 0;
// This code is contributed by lokesh (lokeshmvs21)
}
Java
// Java Program to Reverse a List using Data Swapping
import java.util.*;
import java.io.*;
class GFG
{
static class Node
{
int data;
Node prev, next;
};
static Node newNode(int val)
{
Node temp = new Node();
temp.data = val;
temp.prev = temp.next = null;
return temp;
}
static void printList(Node head)
{
while (head.next != null)
{
System.out.print(head.data+ " <--> ");
head = head.next;
}
System.out.println( head.data );
}
// Insert a new node at the head of the list
static Node insert(Node head, int val)
{
Node temp = newNode(val);
temp.next = head;
(head).prev = temp;
(head) = temp;
return head;
}
// Function to reverse the list
static Node reverseList(Node head)
{
Node left = head, right = head;
// Traverse the list and set right pointer to
// end of list
while (right.next != null)
right = right.next;
// Swap data of left and right pointer and move
// them towards each other until they meet or
// cross each other
while (left != right && left.prev != right)
{
// Swap data of left and right pointer
int t = left.data;
left.data = right.data;
right.data = t;
// Advance left pointer
left = left.next;
// Advance right pointer
right = right.prev;
}
return head;
}
// Driver code
public static void main(String args[])
{
Node head = newNode(5);
head = insert(head, 4);
head = insert(head, 3);
head = insert(head, 2);
head = insert(head, 1);
printList(head);
System.out.println("List After Reversing");
head=reverseList(head);
printList(head);
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 Program to Reverse a List
# using Data Swapping
import math
class Node:
def __init__(self, data):
self.data = data
self.next = None
def newNode(val):
temp = Node(val)
temp.data = val
temp.prev =None
temp.next = None
return temp
def printList( head):
while (head.next != None):
print(head.data, end = "<-->")
head = head.next
print(head.data)
# Insert a new node at the head of the list
def insert(head, val):
temp = newNode(val)
temp.next = head
(head).prev = temp
(head) = temp
return head
# Function to reverse the list
def reverseList( head):
left = head
right = head
# Traverse the list and set right
# pointer to end of list
while (right.next != None):
right = right.next
# Swap data of left and right pointer
# and move them towards each other
# until they meet or cross each other
while (left != right and left.prev != right):
# Swap data of left and right pointer
t = left.data
left.data = right.data
right.data = t
# Advance left pointer
left = left.next
# Advance right pointer
right = right.prev
return head
# Driver code
if __name__=='__main__':
head = newNode(5)
head = insert(head, 4)
head = insert(head, 3)
head = insert(head, 2)
head = insert(head, 1)
printList(head)
print("List After Reversing")
head = reverseList(head)
printList(head)
# This code is contributed by AbhiThakur
C#
// C# Program to Reverse a List using Data Swapping
using System;
class GFG
{
public class Node
{
public int data;
public Node prev, next;
};
static Node newNode(int val)
{
Node temp = new Node();
temp.data = val;
temp.prev = temp.next = null;
return temp;
}
static void printList(Node head)
{
while (head.next != null)
{
Console.Write(head.data+ " <--> ");
head = head.next;
}
Console.WriteLine( head.data );
}
// Insert a new node at the head of the list
static Node insert(Node head, int val)
{
Node temp = newNode(val);
temp.next = head;
(head).prev = temp;
(head) = temp;
return head;
}
// Function to reverse the list
static Node reverseList(Node head)
{
Node left = head, right = head;
// Traverse the list and set right pointer to
// end of list
while (right.next != null)
right = right.next;
// Swap data of left and right pointer and move
// them towards each other until they meet or
// cross each other
while (left != right && left.prev != right)
{
// Swap data of left and right pointer
int t = left.data;
left.data = right.data;
right.data = t;
// Advance left pointer
left = left.next;
// Advance right pointer
right = right.prev;
}
return head;
}
// Driver code
public static void Main(String []args)
{
Node head = newNode(5);
head = insert(head, 4);
head = insert(head, 3);
head = insert(head, 2);
head = insert(head, 1);
printList(head);
Console.WriteLine("List After Reversing");
head=reverseList(head);
printList(head);
}
}
// This code has been contributed by 29AjayKumar
JavaScript
<script>
// javascript Program to Reverse a List using Data Swapping
class Node {
constructor(val) {
this.data = val;
this.prev = null;
this.next = null;
}
}
function newNode(val) {
var temp = new Node();
temp.data = val;
temp.prev = temp.next = null;
return temp;
}
function printList(head) {
while (head.next != null) {
document.write(head.data + " <-> ");
head = head.next;
}
document.write(head.data);
}
// Insert a new node at the head of the list
function insert(head , val) {
var temp = newNode(val);
temp.next = head;
(head).prev = temp;
(head) = temp;
return head;
}
// Function to reverse the list
function reverseList(head) {
var left = head, right = head;
// Traverse the list and set right pointer to
// end of list
while (right.next != null)
right = right.next;
// Swap data of left and right pointer and move
// them towards each other until they meet or
// cross each other
while (left != right && left.prev != right) {
// Swap data of left and right pointer
var t = left.data;
left.data = right.data;
right.data = t;
// Advance left pointer
left = left.next;
// Advance right pointer
right = right.prev;
}
return head;
}
// Driver code
var head = newNode(5);
head = insert(head, 4);
head = insert(head, 3);
head = insert(head, 2);
head = insert(head, 1);
printList(head);
document.write("<br/>List After Reversing<br/>");
head = reverseList(head);
printList(head);
// This code contributed by umadevi9616
</script>
Output1 <--> 2 <--> 3 <--> 4 <--> 5
List After Reversing
5 <--> 4 <--> 3 <--> 2 <--> 1
Time Complexity: O(n), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
Auxiliary Space: O(1), as we are not using any extra space.
Similar Reads
Reverse a Doubly Linked List without swapping nodes
Write a program to reverse the given Doubly Linked List. See below diagrams for example. (a) Original Doubly Linked List (b) Reversed Doubly Linked List Approach: In the previous post, doubly linked list is being reversed by swapping prev and next pointers for all nodes, changing prev of the head (o
10 min read
Reverse a Doubly Linked List
Given a Doubly Linked List, the task is to reverse the Doubly Linked List.Examples:Input: Doubly Linked List = 1 <-> 2 <-> 3 -> NULL Doubly Linked List Output: Reversed Doubly Linked List = 3 <-> 2 <-> 1 -> NULLReversed Doubly Linked ListInput: Doubly Linked List = 1 -
15 min read
Reverse a Doubly linked list using recursion
Given a doubly linked list. Reverse it using recursion. Original Doubly linked list Reversed Doubly linked list We have discussed Iterative solution to reverse a Doubly Linked List Algorithm: If list is empty, return Reverse head by swapping head->prev and head->next If prev = NULL it means th
9 min read
Reverse a doubly circular linked list
The problem is to reverse the given doubly circular linked list. Examples: Input: Output: Algorithm: insertEnd(head, new_node) Declare last if head == NULL then new_node->next = new_node->prev = new_node head = new_node return last = head->prev new_node->next = head head->prev = new_n
11 min read
POTD Solutions | 18 Novâ 23 | Reverse a Doubly Linked List
View all POTD Solutions Welcome to the daily solutions of our PROBLEM OF THE DAY (POTD). We will discuss the entire problem step-by-step and work towards developing an optimized solution. This will not only help you brush up on your concepts of Linked Lists but will also help you build up problem-so
4 min read
Reverse a doubly linked list in groups of K size
Given a Doubly linked list containing n nodes. The task is to reverse every group of k nodes in the list. If the number of nodes is not a multiple of k then left-out nodes, in the end should be considered as a group and must be reversed.Examples: Input: 1 <-> 2 <-> 3 <-> 4 <-
15+ min read
Traversal in Doubly Linked List
Traversal of Doubly Linked List is one of the fundamental operations, where we traverse or visit each node of the linked list. In this article, we will cover how to traverse all the nodes of a doubly linked list and its implementation.Examples:Input: 10 <-> 20 <-> 30 <-> 40Output:
15+ min read
Reverse alternate K nodes in a Singly Linked List
Given a linked list, The task is to reverse alternate k nodes. If the number of nodes left at the end of the list is fewer than k, reverse these remaining nodes or leave them in their original order, depending on the alternation pattern.Example: Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6 ->
15+ min read
Reverse a Linked List
Given a linked list, the task is to reverse the linked list by changing the links between nodes.Examples: Input: head: 1 -> 2 -> 3 -> 4 -> NULLOutput: head: 4 -> 3 -> 2 -> 1 -> NULLExplanation: Reversed Linked List: Input: head: 1 -> 2 -> 3 -> 4 -> 5 -> NULLOut
15+ min read
Reverse a circular linked list
Given a circular linked list of size n. The problem is to reverse the given circular linked list by changing links between the nodes.Examples: INPUT: OUTPUT: Approach: The approach is same as followed in reversing a singly linked list. Only here we have to make one more adjustment by linking the las
7 min read