Open In App

Move first element to end of a given Linked List

Last Updated : 19 Apr, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

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 address of last node(last) and other for address of first node(first). After the end of loop do following operations. 

  1. Make head as second node (*head_ref = first->next). 
  2. Set next of first as NULL (first->next = NULL). 
  3. Set next of last as first ( last->next = first) 

Steps to solve the problem:

1. check if *head_ref is equal to null or *head_ref ->next is null than return.

2. declare two node pointers first and second.

3. while last->next is not null:

           * update last to last->next.

4. update *head_ref to first->next.

5. point first->next to null.

6. point last->next to first.

Implementation:

C++
/* C++ Program to move first element to end 
   in a given linked list */
#include <stdio.h>
#include <stdlib.h>

/* A linked list node */
struct Node {
    int data;
    struct Node* next;
};

/* We are using a double pointer head_ref 
   here because we change head of the linked 
   list inside this function.*/
void moveToEnd(struct Node** head_ref)
{
    /* If linked list is empty, or it contains 
       only one node, then nothing needs to be 
       done, simply return */
    if (*head_ref == NULL || (*head_ref)->next == NULL)
        return;

    /* Initialize first and last pointers */
    struct Node* first = *head_ref;
    struct Node* last = *head_ref;

    /*After this loop last contains address 
    of last node in Linked List */
    while (last->next != NULL) {
        last = last->next;
    }

    /* Change the head pointer to point 
       to second node now */
    *head_ref = first->next;

    /* Set the next of first as NULL */
    first->next = NULL;

    /* Set the next of last as first */
    last->next = first;
}

/* UTILITY FUNCTIONS */
/* Function to add a node at the beginning 
   of Linked List */
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;
}

/* Function to print nodes in a given linked list */
void printList(struct Node* node)
{
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}

/* Driver program to test above function */
int main()
{
    struct Node* start = NULL;

    /* The constructed linked list is:
     1->2->3->4->5 */
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);

    printf("\n Linked list before moving first to end\n");
    printList(start);

    moveToEnd(&start);

    printf("\n Linked list after moving first to end\n");
    printList(start);

    return 0;
}
Java
/* Java Program to move first element to end 
in a given linked list */
class Sol
{
    
/* A linked list node */
static class Node
{ 
    int data; 
    Node next; 
}; 

/* We are using a double pointer head_ref 
here because we change head of the linked 
list inside this function.*/
static Node moveToEnd( Node head_ref) 
{ 
    /* If linked list is empty, or it contains 
    only one node, then nothing needs to be 
    done, simply return */
    if (head_ref == null || (head_ref).next == null) 
        return null; 

    /* Initialize first and last pointers */
    Node first = head_ref; 
    Node last = head_ref; 

    /*After this loop last contains address 
    of last node in Linked List */
    while (last.next != null) 
    { 
        last = last.next; 
    } 

    /* Change the head pointer to point 
    to second node now */
    head_ref = first.next; 

    /* Set the next of first as null */
    first.next = null; 

    /* Set the next of last as first */
    last.next = first; 
    return head_ref;
} 

/* UTILITY FUNCTIONS */
/* Function to add a node at the beginning 
of Linked List */
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;
} 

/* Function to print nodes in a given linked list */
static void printList( Node node) 
{ 
    while (node != null)
    { 
        System.out.printf("%d ", node.data); 
        node = node.next; 
    } 
} 

/* Driver code */
public static void main(String args[])
{ 
    Node start = null; 

    /* The constructed linked list is: 
    1.2.3.4.5 */
    start = push(start, 5); 
    start = push(start, 4); 
    start = push(start, 3); 
    start = push(start, 2); 
    start = push(start, 1); 

    System.out.printf("\n Linked list before moving first to end\n"); 
    printList(start); 

    start = moveToEnd(start); 

    System.out.printf("\n Linked list after moving first to end\n"); 
    printList(start); 
}
} 

// This code is contributed by Arnab Kundu
Python3
# Python3 Program to move first element to end 
# in a given linked list 

# A linked list node 
class Node:
    def __init__(self):
        self.data = 0
        self.next = None

# We are using a double pointer head_ref 
# here because we change head of the linked 
# list inside this function.
def moveToEnd( head_ref) :

    # If linked list is empty, or it contains 
    # only one node, then nothing needs to be 
    # done, simply return 
    if (head_ref == None or (head_ref).next == None) :
        return None

    # Initialize first and last pointers 
    first = head_ref 
    last = head_ref 

    # After this loop last contains address 
    # of last node in Linked List 
    while (last.next != None) :
    
        last = last.next
    
    # Change the head pointer to point 
    # to second node now 
    head_ref = first.next

    # Set the next of first as None 
    first.next = None

    # Set the next of last as first 
    last.next = first 
    return head_ref

# UTILITY FUNCTIONS 
# Function to add a node at the beginning 
# of Linked List 
def push( head_ref, new_data) :

    new_node = Node() 
    new_node.data = new_data 
    new_node.next = (head_ref) 
    (head_ref) = new_node
    return head_ref

# Function to print nodes in a given linked list 
def printList(node) :

    while (node != None):
    
        print(node.data, end = " ") 
        node = node.next
    
# Driver code 

start = None

# The constructed linked list is: 
#1.2.3.4.5 
start = push(start, 5) 
start = push(start, 4) 
start = push(start, 3) 
start = push(start, 2) 
start = push(start, 1) 

print("\n Linked list before moving first to end") 
printList(start) 

start = moveToEnd(start) 

print("\n Linked list after moving first to end") 
printList(start) 

# This code is contributed by Arnab Kundu
C#
/* C# Program to move first element to end 
in a given linked list */
using System;

class GFG
{
    
/* A linked list node */
public class Node
{ 
    public int data; 
    public Node next; 
}; 

/* We are using a double pointer head_ref 
here because we change head of the linked 
list inside this function.*/
static Node moveToEnd( Node head_ref) 
{ 
    /* If linked list is empty, or it contains 
    only one node, then nothing needs to be 
    done, simply return */
    if (head_ref == null || (head_ref).next == null) 
        return null; 

    /* Initialize first and last pointers */
    Node first = head_ref; 
    Node last = head_ref; 

    /*After this loop last contains address 
    of last node in Linked List */
    while (last.next != null) 
    { 
        last = last.next; 
    } 

    /* Change the head pointer to point 
    to second node now */
    head_ref = first.next; 

    /* Set the next of first as null */
    first.next = null; 

    /* Set the next of last as first */
    last.next = first; 
    return head_ref;
} 

/* UTILITY FUNCTIONS */
/* Function to add a node at the beginning 
of Linked List */
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;
} 

/* Function to print nodes in a given linked list */
static void printList( Node node) 
{ 
    while (node != null)
    { 
        Console.Write("{0} ", node.data); 
        node = node.next; 
    } 
} 

/* Driver code */
public static void Main(String []args)
{ 
    Node start = null; 

    /* The constructed linked list is: 
    1.2.3.4.5 */
    start = push(start, 5); 
    start = push(start, 4); 
    start = push(start, 3); 
    start = push(start, 2); 
    start = push(start, 1); 

    Console.Write("\n Linked list before moving first to end\n"); 
    printList(start); 

    start = moveToEnd(start); 

    Console.Write("\n Linked list after moving first to end\n"); 
    printList(start); 
}
}

// This code is contributed by 29AjayKumar
JavaScript
<script>

// JavaScript program to move first element
// to end in a given linked list 

/* A linked list node */
class Node 
{
    constructor()
    {
        this.data = 0;
        this.next = null;
    }
}

/* We are using a double pointer head_ref
here because we change head of the linked
list inside this function.*/
function moveToEnd(head_ref)
{
    
    /* If linked list is empty, or it contains
    only one node, then nothing needs to be
    done, simply return */
    if (head_ref == null || head_ref.next == null)
        return null;
    
    /* Initialize first and last pointers */
    var first = head_ref;
    var last = head_ref;
    
    /*After this loop last contains address
    of last node in Linked List */
    while (last.next != null) 
    {
        last = last.next;
    }
    
    /* Change the head pointer to point
    to second node now */
    head_ref = first.next;
    
    /* Set the next of first as null */
    first.next = null;
    
    /* Set the next of last as first */
    last.next = first;
    return head_ref;
}

/* UTILITY FUNCTIONS */
/* Function to add a node at the beginning
of Linked List */
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;
}

// Function to print nodes in 
// a given linked list 
function printList(node) 
{
    while (node != null) 
    {
        document.write(node.data + " ");
        node = node.next;
    }
}

// Driver code 
var start = null;

// The constructed linked list is:
// 1.2.3.4.5 
start = push(start, 5);
start = push(start, 4);
start = push(start, 3);
start = push(start, 2);
start = push(start, 1);

document.write("Linked list before " + 
               "moving first to end<br>");
printList(start);
start = moveToEnd(start);

document.write("<br> Linked list after moving " + 
               "first to end<br>");
printList(start);

// This code is contributed by rdtank

</script>

Output
 Linked list before moving first to end
1 2 3 4 5 
 Linked list after moving first to end
2 3 4 5 1 

Time Complexity: O(n) where n is the number of nodes in the given Linked List.
Auxiliary Space: O(1)

Method: Optimized Move First Element to End of Linked List

Steps:

  1. If the linked list is empty or has only one element, return the same linked list.
  2. Store the head node in a variable and set the head to the second node.
  3. Traverse the linked list until the last node.
  4. Set the next of the last node to the original head node.
  5. Set the next of the original head node to None.
  6. Return the modified linked list.
C++
#include <iostream>

using namespace std;

class Node {
public:
    int data;
    Node* next;

    Node(int data) {
        this->data = data;
        next = nullptr;
    }
};

class LinkedList {
public:
    Node* head;

    LinkedList() {
        head = nullptr;
    }

    void insert(int data) {
        Node* new_node = new Node(data);
        if (!head) {
            head = new_node;
        } else {
            Node* current_node = head;
            while (current_node->next) {
                current_node = current_node->next;
            }
            current_node->next = new_node;
        }
    }

    void display() {
        Node* current_node = head;
        while (current_node) {
            cout << current_node->data << " ";
            current_node = current_node->next;
        }
        cout << endl;
    }

    Node* move_first_to_end() {
        if (!head || !head->next) {
            return head;
        }

        Node* old_head = head;
        head = head->next;

        Node* current_node = head;
        while (current_node->next) {
            current_node = current_node->next;
        }

        current_node->next = old_head;
        old_head->next = nullptr;

        return head;
    }
};

int main() {
    LinkedList linked_list;
    linked_list.insert(1);
    linked_list.insert(2);
    linked_list.insert(3);
    linked_list.insert(4);
    linked_list.insert(5);
    cout << "Original Linked List: ";
    linked_list.display();

    linked_list.move_first_to_end();
    cout << "Modified Linked List: ";
    linked_list.display();

    return 0;
}

//This code is contributed by Akash Jha
Java
public class Main {
    public static void main(String[] args) {
        LinkedList linked_list = new LinkedList();
        linked_list.insert(1);
        linked_list.insert(2);
        linked_list.insert(3);
        linked_list.insert(4);
        linked_list.insert(5);
        System.out.print("Original Linked List: ");
        linked_list.display();

        linked_list.move_first_to_end();
        System.out.print("Modified Linked List: ");
        linked_list.display();
    }

    private static class Node {
        public int data;
        public Node next;

        public Node(int data) {
            this.data = data;
            this.next = null;
        }
    }

    private static class LinkedList {
        public Node head;

        public LinkedList() {
            this.head = null;
        }

        public void insert(int data) {
            Node new_node = new Node(data);
            if (this.head == null) {
                this.head = new_node;
            } else {
                Node current_node = this.head;
                while (current_node.next != null) {
                    current_node = current_node.next;
                }
                current_node.next = new_node;
            }
        }

        public void display() {
            Node current_node = this.head;
            while (current_node != null) {
                System.out.print(current_node.data + " ");
                current_node = current_node.next;
            }
            System.out.println();
        }

        public Node move_first_to_end() {
            if (this.head == null || this.head.next == null) {
                return this.head;
            }

            Node old_head = this.head;
            this.head = this.head.next;

            Node current_node = this.head;
            while (current_node.next != null) {
                current_node = current_node.next;
            }

            current_node.next = old_head;
            old_head.next = null;

            return this.head;
        }
    }
}

//This code is contributed by Akash Jha
Python3
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def insert(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
        else:
            current_node = self.head
            while current_node.next:
                current_node = current_node.next
            current_node.next = new_node

    def display(self):
        current_node = self.head
        while current_node:
            print(current_node.data, end=' ')
            current_node = current_node.next
        print()

    def move_first_to_end(self):
        if not self.head or not self.head.next:
            return self.head

        old_head = self.head
        self.head = self.head.next

        current_node = self.head
        while current_node.next:
            current_node = current_node.next

        current_node.next = old_head
        old_head.next = None

        return self.head
linked_list = LinkedList()
linked_list.insert(1)
linked_list.insert(2)
linked_list.insert(3)
linked_list.insert(4)
linked_list.insert(5)
print("Original Linked List: ")
linked_list.display()

linked_list.move_first_to_end()
print("Modified Linked List: ")
linked_list.display()
C#
using System;

class Node
{
    public int data;
    public Node next;

    public Node(int data)
    {
        this.data = data;
        next = null;
    }
}

class LinkedList
{
    public Node head;

    public LinkedList()
    {
        head = null;
    }

    public void insert(int data)
    {
        Node new_node = new Node(data);
        if (head == null)
        {
            head = new_node;
        }
        else
        {
            Node current_node = head;
            while (current_node.next != null)
            {
                current_node = current_node.next;
            }
            current_node.next = new_node;
        }
    }

    public void display()
    {
        Node current_node = head;
        while (current_node != null)
        {
            Console.Write(current_node.data + " ");
            current_node = current_node.next;
        }
        Console.WriteLine();
    }

    public Node move_first_to_end()
    {
        if (head == null || head.next == null)
        {
            return head;
        }

        Node old_head = head;
        head = head.next;

        Node current_node = head;
        while (current_node.next != null)
        {
            current_node = current_node.next;
        }

        current_node.next = old_head;
        old_head.next = null;

        return head;
    }
}

class Program
{
    static void Main(string[] args)
    {
        LinkedList linked_list = new LinkedList();
        linked_list.insert(1);
        linked_list.insert(2);
        linked_list.insert(3);
        linked_list.insert(4);
        linked_list.insert(5);
        Console.Write("Original Linked List: ");
        linked_list.display();

        linked_list.move_first_to_end();
        Console.Write("Modified Linked List: ");
        linked_list.display();

        Console.ReadLine();
    }
}
//This code is contributed by Akash Jha
JavaScript
class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class LinkedList {
  constructor() {
    this.head = null;
  }

  insert(data) {
    let new_node = new Node(data);
    if (this.head == null) {
      this.head = new_node;
    } else {
      let current_node = this.head;
      while (current_node.next != null) {
        current_node = current_node.next;
      }
      current_node.next = new_node;
    }
  }

  display() {
    let current_node = this.head;
    while (current_node != null) {
      console.log(current_node.data + " ");
      current_node = current_node.next;
    }
    console.log();
  }

  move_first_to_end() {
    if (this.head == null || this.head.next == null) {
      return this.head;
    }

    let old_head = this.head;
    this.head = this.head.next;

    let current_node = this.head;
    while (current_node.next != null) {
      current_node = current_node.next;
    }

    current_node.next = old_head;
    old_head.next = null;

    return this.head;
  }
}

let linked_list = new LinkedList();
linked_list.insert(1);
linked_list.insert(2);
linked_list.insert(3);
linked_list.insert(4);
linked_list.insert(5);
console.log("Original Linked List: ");
linked_list.display();

linked_list.move_first_to_end();
console.log("Modified Linked List: ");
linked_list.display();

//This code is contributed by Akash Jha

Output
Original Linked List: 
1 2 3 4 5 
Modified Linked List: 
2 3 4 5 1 

Time complexity: O(n) 

Auxiliary space: O(1) 


Next Article
Article Tags :
Practice Tags :

Similar Reads