Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Interview Problems on Linked List
  • Practice Linked List
  • MCQs on Linked List
  • Linked List Tutorial
  • Types of Linked List
  • Singly Linked List
  • Doubly Linked List
  • Circular Linked List
  • Circular Doubly Linked List
  • Linked List vs Array
  • Time & Space Complexity
  • Advantages & Disadvantages
Open In App
Next Article:
Move last element to front of a given Linked List
Next article icon

Move the Kth Element in a Doubly Linked List to the End

Last Updated : 04 Dec, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a doubly linked list and an integer K, you need to move the Kth element to the end of the list while maintaining the order of the other elements.

Examples:

Input: DLL: 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7 -> NULL, K = 1
Output: 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7 <-> 2 -> NULL
Explanation: We move the 1st element (with value 2) to the end of the list while preserving the order of other elements.

Input: DLL: 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 -> NULL, K = 3
Output: 1 <-> 2 <-> 4 <-> 5 <-> 6 <-> 3 -> NULL
Explanation: we move the 3rd element (with value 3) to the end of the list, maintaining the order of other elements.

Approach: To solve the problem follow the below idea:

To reposition the Kth element to the end of a doubly linked list while preserving the order of other elements, we follow a systematic procedure.

  • First, we address the special case when K is equal to 1, as the first element lacks a previous node. In this case, we detach the first element from the list and relocate it to the end while updating the head pointer.
  • For K values greater than 1, we traverse the list to find the Kth element, keeping track of its previous node. If K exceeds the list's length, the function exits without changes.
  • Next, we adjust the pointers of nodes around the Kth element to bypass it, effectively removing it from its current position in the list.
  • Finally, we place the Kth element at the end of the list by updating its pointers to connect with the last node. This approach efficiently handles various scenarios, ensuring that the Kth element is moved to the end while maintaining the order of the remaining elements.

Steps of the approach:

  • Check for invalid input: Ensure the doubly linked list is not empty and K is a positive integer.
  • Special handling for K = 1: If K is 1, move the first element to the end and update the head pointer.
  • For K > 1, traverse the list to locate the Kth element while tracking its previous node.
  • Check if K is greater than the list's length; if so, exit without making changes.
  • If K is valid, adjust pointers to bypass the Kth element and remove it from its current position.
  • Find the last element in the list using a loop.
  • Make the Kth element the new last element by updating pointers.
  • Ensure the bidirectional linkage between the Kth element and the previous last element.
  • Update the last element's next pointer to connect it to the Kth element.
  • Set the Kth element's next pointer to null, making it the new last element in the list.

Below is the implementation for the above approach:

C++
// C++ code for the above approach: #include <bits/stdc++.h> using namespace std; // Definition for a doubly-linked list node. struct Node {     int data;     Node* next;     Node* prev; };  // Function to move the Kth element // to the end of the doubly linked list. void moveKthToEnd(Node*& head, int K) {     if (head == nullptr || K < 1) {         return; // Invalid input     }      Node* current = head;     Node* prevKth = nullptr;      if (K == 1) {         // Special case for moving the         // first element to the end         Node* newHead = head->next;         head->prev = nullptr;         Node* tail = head;         while (tail->next) {             tail = tail->next;         }         tail->next = current;         current->prev = tail;         current->next = nullptr;         head = newHead;         return;     }      for (int i = 1; i < K && current; i++) {         prevKth = current;         current = current->next;     }      // K is greater than the length of the list     if (current == nullptr) {         return;     }      // Adjust pointers to bypass     // the Kth node     if (prevKth) {         prevKth->next = current->next;     }     if (current->next) {         current->next->prev = prevKth;     }      // Move the Kth node to the end     Node* tail = head;     while (tail->next) {         tail = tail->next;     }      tail->next = current;     current->prev = tail;     current->next = nullptr; }  // Function to print the doubly linked list. void printList(Node* head) {     while (head) {         cout << head->data;         if (head->next) {             cout << " <-> ";         }         head = head->next;     }     cout << " -> NULL" << std::endl; }  // Drivers code int main() {     // Create the first example doubly     // linked list:     // 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7      // Create the nodes     Node* node1 = new Node{ 2, nullptr, nullptr };     Node* node2 = new Node{ 6, nullptr, node1 };     Node* node3 = new Node{ 3, nullptr, node2 };     Node* node4 = new Node{ 8, nullptr, node3 };     Node* node5 = new Node{ 11, nullptr, node4 };     Node* node6 = new Node{ 23, nullptr, node5 };     Node* node7 = new Node{ 7, nullptr, node6 };      // Connect the nodes     node1->next = node2;     node2->next = node3;     node3->next = node4;     node4->next = node5;     node5->next = node6;     node6->next = node7;      // Set the head of the list     Node* head = node1;      // Print the original list     cout << "Original List: ";     printList(head);      // Move the 5th element to the end     moveKthToEnd(head, 1);      // Print the modified list     cout << "Modified List: ";     printList(head);      return 0; } 
Java
class Node {     int data;     Node next;     Node prev;      Node(int val) {         data = val;         next = null;         prev = null;     } }  public class Main {     // Function to move the Kth element to the end of the doubly linked list     static void moveKthToEnd(Node head, int K) {         if (head == null || K < 1) {             return; // Invalid input         }          Node current = head;         Node prevKth = null;          if (K == 1) {             // Special case for moving the first element to the end             Node newHead = head.next;             head.prev = null;             Node tail = head;             while (tail.next != null) {                 tail = tail.next;             }             tail.next = current;             current.prev = tail;             current.next = null;             head = newHead;             return;         }          for (int i = 1; i < K && current != null; i++) {             prevKth = current;             current = current.next;         }          // K is greater than the length of the list         if (current == null) {             return;         }          // Adjust pointers to bypass the Kth node         if (prevKth != null) {             prevKth.next = current.next;         }         if (current.next != null) {             current.next.prev = prevKth;         }          // Move the Kth node to the end         Node tail = head;         while (tail.next != null) {             tail = tail.next;         }          tail.next = current;         current.prev = tail;         current.next = null;     }      // Function to print the doubly linked list     static void printList(Node head) {         while (head != null) {             System.out.print(head.data);             if (head.next != null) {                 System.out.print(" <-> ");             }             head = head.next;         }         System.out.println(" -> NULL");     }      public static void main(String[] args) {         // Create the first example doubly linked list:         // 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7          // Create the nodes         Node node1 = new Node(2);         Node node2 = new Node(6);         Node node3 = new Node(3);         Node node4 = new Node(8);         Node node5 = new Node(11);         Node node6 = new Node(23);         Node node7 = new Node(7);          // Connect the nodes         node1.next = node2;         node2.next = node3;         node3.next = node4;         node4.next = node5;         node5.next = node6;         node6.next = node7;          node2.prev = node1;         node3.prev = node2;         node4.prev = node3;         node5.prev = node4;         node6.prev = node5;         node7.prev = node6;          // Set the head of the list         Node head = node1;          // Print the original list         System.out.print("Original List: ");         printList(head);          // Move the 2nd element to the end         moveKthToEnd(head, 2);          // Print the modified list         System.out.print("Modified List: ");         printList(head);     } } 
Python3
class Node:     def __init__(self, val):         self.data = val         self.next = None         self.prev = None  # Function to move the Kth element to the end of the doubly linked list def moveKthToEnd(head, K):     if head is None or K < 1:         return  # Invalid input      current = head     prevKth = None      if K == 1:         # Special case for moving the first element to the end         newHead = head.next         head.prev = None         tail = head         while tail.next is not None:             tail = tail.next         tail.next = current         current.prev = tail         current.next = None         head = newHead         return      for i in range(1, K):         if current is not None:             prevKth = current             current = current.next      # K is greater than the length of the list     if current is None:         return      # Adjust pointers to bypass the Kth node     if prevKth is not None:         prevKth.next = current.next     if current.next is not None:         current.next.prev = prevKth      # Move the Kth node to the end     tail = head     while tail.next is not None:         tail = tail.next      tail.next = current     current.prev = tail     current.next = None  # Function to print the doubly linked list def printList(head):     while head is not None:         print(head.data, end="")         if head.next is not None:             print(" <-> ", end="")         head = head.next     print(" -> NULL")  node1 = Node(2) node2 = Node(6) node3 = Node(3) node4 = Node(8) node5 = Node(11) node6 = Node(23) node7 = Node(7)   node1.next = node2 node2.next = node3 node3.next = node4 node4.next = node5 node5.next = node6 node6.next = node7  node2.prev = node1 node3.prev = node2 node4.prev = node3 node5.prev = node4 node6.prev = node5 node7.prev = node6  # Set the head of the list head = node1  print("Original List: ", end="") printList(head)  # Move the 2nd element to the end moveKthToEnd(head, 2)  print("Modified List: ", end="") printList(head) 
C#
using System;  public class Node {     public int data;     public Node next;     public Node prev;      public Node(int val)     {         data = val;         next = null;         prev = null;     } }  public class MainClass {     // Function to move the Kth element to the end of the doubly linked list     static void MoveKthToEnd(Node head, int K)     {         if (head == null || K < 1)         {             return; // Invalid input         }          Node current = head;         Node prevKth = null;          if (K == 1)         {             // Special case for moving the first element to the end             Node newHead = head.next;             head.prev = null;             Node firstTail = head;             while (firstTail.next != null)             {                 firstTail = firstTail.next;             }             firstTail.next = current;             current.prev = firstTail;             current.next = null;             head = newHead;             return;         }          for (int i = 1; i < K && current != null; i++)         {             prevKth = current;             current = current.next;         }          // K is greater than the length of the list         if (current == null)         {             return;         }          // Adjust pointers to bypass the Kth node         if (prevKth != null)         {             prevKth.next = current.next;         }         if (current.next != null)         {             current.next.prev = prevKth;         }          // Move the Kth node to the end         Node tail = head;         while (tail.next != null)         {             tail = tail.next;         }          tail.next = current;         current.prev = tail;         current.next = null;     }      // Function to print the doubly linked list     static void PrintList(Node head)     {         while (head != null)         {             Console.Write(head.data);             if (head.next != null)             {                 Console.Write(" <-> ");             }             head = head.next;         }         Console.WriteLine(" -> NULL");     }      public static void Main(string[] args)     {         // Create the first example doubly linked list:         // 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7          // Create the nodes         Node node1 = new Node(2);         Node node2 = new Node(6);         Node node3 = new Node(3);         Node node4 = new Node(8);         Node node5 = new Node(11);         Node node6 = new Node(23);         Node node7 = new Node(7);          // Connect the nodes         node1.next = node2;         node2.next = node3;         node3.next = node4;         node4.next = node5;         node5.next = node6;         node6.next = node7;          node2.prev = node1;         node3.prev = node2;         node4.prev = node3;         node5.prev = node4;         node6.prev = node5;         node7.prev = node6;          // Set the head of the list         Node head = node1;          // Print the original list         Console.Write("Original List: ");         PrintList(head);          // Move the 2nd element to the end         MoveKthToEnd(head, 2);          // Print the modified list         Console.Write("Modified List: ");         PrintList(head);     } } 
JavaScript
// Definition for a doubly-linked list node. class Node {     constructor(data, next, prev) {         this.data = data;         this.next = next;         this.prev = prev;     } }  // Function to move the Kth element // to the end of the doubly linked list. function moveKthToEnd(head, K) {     if (head === null || K < 1) {         return; // Invalid input     }      let current = head;     let prevKth = null;      if (K === 1) {         // Special case for moving the         // first element to the end         let newHead = head.next;         head.prev = null;         let tail = head;         while (tail.next) {             tail = tail.next;         }         tail.next = current;         current.prev = tail;         current.next = null;         head = newHead;         return;     }      for (let i = 1; i < K && current; i++) {         prevKth = current;         current = current.next;     }      // K is greater than the length of the list     if (current === null) {         return;     }      // Adjust pointers to bypass     // the Kth node     if (prevKth) {         prevKth.next = current.next;     }     if (current.next) {         current.next.prev = prevKth;     }      // Move the Kth node to the end     let tail = head;     while (tail.next) {         tail = tail.next;     }      tail.next = current;     current.prev = tail;     current.next = null; }  // Function to print the doubly linked list. function printList(head) {     while (head) {         console.log(head.data);         if (head.next) {             console.log(" <-> ");         }         head = head.next;     }     console.log(" -> NULL"); }  // Drivers code // Create the first example doubly // linked list: 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7  // Create the nodes let node1 = new Node(2, null, null); let node2 = new Node(6, null, node1); let node3 = new Node(3, null, node2); let node4 = new Node(8, null, node3); let node5 = new Node(11, null, node4); let node6 = new Node(23, null, node5); let node7 = new Node(7, null, node6);  // Connect the nodes node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = node7;  // Set the head of the list let head = node1;  // Print the original list console.log("Original List: "); printList(head);  // Move the 5th element to the end moveKthToEnd(head, 1);  // Print the modified list console.log("Modified List: "); printList(head); 

Output
Original List: 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7 -> NULL Modified List: 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7 <-> 2 -> NULL

Time Complexity: O(N) due to the traversal of the list, where N is the number of elements.
Space Complexity: O(1) as we are not using any extra space.


Next Article
Move last element to front of a given Linked List
author
vishaldhaygude01
Improve
Article Tags :
  • Linked List
  • Geeks Premier League
  • DSA
  • doubly linked list
  • Geeks Premier League 2023
Practice Tags :
  • Linked List

Similar Reads

  • Move the Kth element to the Front of a Doubly Linked List
    Given a doubly linked list and an integer K, you need to move the Kth element to the front of the list while maintaining the order of the other elements. Examples: Input: DLL: 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7 -> NULL, K = 4Output: 8 <-> 2 <->
    11 min read
  • Move all occurrences of an element to end in a linked list
    Given a linked list and a key in it, the task is to move all occurrences of the given key to the end of the linked list, keeping the order of all other elements the same. Examples: Input : 1 -> 2 -> 2 -> 4 -> 3 key = 2 Output : 1 -> 4 -> 3 -> 2 -> 2 Input : 6 -> 6 -> 7
    15+ min read
  • Move first element to end of a given Linked List
    Write a C function that moves first element to end in a given Singly Linked List. For example, if the given Linked List is 1->2->3->4->5, then the function should change the list to 2->3->4->5->1. Algorithm: Traverse the list till last node. Use two pointers: one to store the
    14 min read
  • Move last element to front of a given Linked List | Set 2
    Given a singly linked list and an integer K. The task is to append last K elements of the linked list to front. Examples: Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6, k = 3 Output : 4 -> 5 -> 6 -> 1 -> 2 -> 3 Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6, k = 7 Output : 6 -
    9 min read
  • Move last element to front of a given Linked List
    Given a singly linked list. The task is to move the last node to the front in a given List. Examples: Input: 2->5->6->2->1Output: 1->2->5->6->2Explanation : Node 1 moved to front. Input: 1->2->3->4->5Output: 5->1->2->3->4Explanation : Node 5 moved to f
    8 min read
  • Insert a Node at the end of Doubly Linked List
    Given a Doubly Linked List, the task is to insert a new node at the end of the linked list. Examples: Input: Linked List = 1 <-> 2 <-> 3, NewNode = 4Output: Linked List = 1 <-> 2 <-> 3 <-> 4 Input: Linked List = NULL, NewNode = 1Output: Linked List = 1 Approach: Inserti
    9 min read
  • Replace even nodes of a doubly linked list with the elements of array
    Given a doubly linked list and an array with only odd values. Both are of equal size N. The task is replace all node which have even value with the Array elements from left to right. Examples: Input : List = 6 9 8 7 4 Arr[] = {3, 5, 23, 17, 1} Output : List = 3 9 5 7 23Input : List = 9 14 7 12 8 13
    10 min read
  • Move all zeros to the front of the linked list
    Given a linked list. the task is to move all 0's to the front of the linked list. The order of all other elements except 0 should be the same after rearrangement. Examples: Input : 0 1 0 1 2 0 5 0 4 0 Output :0 0 0 0 0 1 1 2 5 4 Input :1 1 2 3 0 0 0 Output :0 0 0 1 1 2 3Recommended PracticeMove all
    11 min read
  • Delete Nth node from the end of the given linked list
    Given a linked list and an integer N, the task is to delete the Nth node from the end of the given linked list. Examples: Input: 2 -> 3 -> 1 -> 7 -> NULL, N = 1 Output: 2 3 1Explanation: The created linked list is: 2 3 1 7 The linked list after deletion is: 2 3 1 Input: 1 -> 2 -> 3
    10 min read
  • Move the First Fibonacci Number to the End of a Linked List
    Given a singly linked list, the task is to identify the first Fibonacci number in the list and move that node to the end of the linked list. Examples: Input: 10 -> 15 -> 8 -> 13 -> 21 -> 5 -> 2 -> NULLOutput: 10 -> 15 -> 13 -> 21 -> 5 -> 2 -> 8 -> NULLExplan
    12 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences