Open In App

Move last element to front of a given Linked List

Last Updated : 26 Aug, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

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->1
Output: 1->2->5->6->2
Explanation : Node 1 moved to front.

Input: 1->2->3->4->5
Output: 5->1->2->3->4
Explanation : Node 5 moved to front.

[Expected Approach] Traverse Till Last Node – O(n) Time and O(1) space:

Traverse the list till the last node. Use two pointers to store the reference of the last node and second last node. After the end of loop, make the second last node as the last node and the last node as the head node.

Below is the implementation of the above approach:

C++
// C++ Program to move last element
// to front in a given linked list

#include <iostream>
using namespace std;

class Node {
  public:
    int data;
    Node *next;
    Node(int x) {
        data = x;
        next = nullptr;
    }
};

// Function to move the last node to the
// front of the linked list
Node *moveToFront(Node *head) {
  
    // If the list is empty or has only one node,
    // no need to move
    if (head == NULL || head->next == NULL) {
        return head;
    }

    // To keep track of the second last node
    Node *secLast = NULL;

    // To traverse to the last node
    Node *last = head;

    // Traverse the list to find the last and
    // second last nodes
    while (last->next != NULL) {
        secLast = last;
        last = last->next;
    }

    // Change the next of second last node to NULL
    secLast->next = NULL;

    // Make the last node as the new head
    last->next = head;
    head = last;

    return head;
}

void printList(Node *node) {
    while (node != NULL) {
        cout << node->data << " ";
        node = node->next;
    }
    cout << endl;
}

int main() {
  
    // Create a linked list 1->2->3->4->5
    Node *head = new Node(1);
    head->next = new Node(2);
    head->next->next = new Node(3);
    head->next->next->next = new Node(4);
    head->next->next->next->next = new Node(5);

    cout << "Linked list before: " << endl;
    printList(head);

    head = moveToFront(head);

    cout << "Linked list after: " << endl;
    printList(head);

    return 0;
}
C
// C Program to move last element
// to front in a given linked list
#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    struct Node *next;
};


// Function to move the last node to the front of the linked list
struct Node *moveToFront(struct Node *head) {
  
    // If the list is empty or has only one node, no need to move
    if (head == NULL || head->next == NULL) {
        return head;
    }

    // To keep track of the second last node
    struct Node *secLast = NULL;

    // To traverse to the last node
    struct Node *last = head;

    // Traverse the list to find the last and second last nodes
    while (last->next != NULL) {
        secLast = last;
        last = last->next;
    }

    // Change the next of second last node to NULL
    secLast->next = NULL;

    // Make the last node as the new head
    last->next = head;
    head = last;

    return head;
}

void printList(struct Node *node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
    printf("\n");
}


struct Node *createNode(int data)
{
    struct Node *newNode = 
      (struct Node *)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

int main()
{
    // Create a linked list 1->2->3->4->5
    struct Node *head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);
    head->next->next->next->next = createNode(5);

    printf("Linked list before:\n");
    printList(head);

    head = moveToFront(head);

    printf("Linked list after:\n");
    printList(head);

    return 0;
}
Java
// Java Program to move last element
// to front in a given linked list

class Node {
    int data;
    Node next;
    
    Node(int x) {
        data = x;
        next = null;
    }
}

class GfG {
    
    // Function to move the last node to the 
    // front of the linked list
    static Node moveToFront(Node head) {
      
        // If the list is empty or has only one node, 
        // no need to move
        if (head == null || head.next == null) {
            return head;
        }
      
        // To keep track of the second last node
        Node secLast = null; 
        
        // To traverse to the last node
        Node last = head;    

        // Traverse the list to find the last and 
        // second last nodes
        while (last.next != null) {
            secLast = last;
            last = last.next;
        }

        // Change the next of second last node to null
        secLast.next = null;

        // Make the last node as the new head
        last.next = head;
        head = last;

        return head;
    }

    static void printList(Node node) {
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
      
        // Create a linked list 1->2->3->4->5
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(3);
        head.next.next.next = new Node(4);
        head.next.next.next.next = new Node(5);

        System.out.println("Linked list before: ");
        printList(head);

        head = moveToFront(head);

        System.out.println("Linked list after: ");
        printList(head);
    }
}
Python
# Python code to move the last item to front

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

# Function to move the last node 
# to the front of the linked list
def move_to_front(head):
  
    # If the list is empty or has 
    # only one node, no need to move
    if head is None or head.next is None:
        return head
      
	# To keep track of the second last node
    sec_last = None  
    
    # To traverse to the last node
    last = head      

    # Traverse the list to find the 
    # last and second last nodes
    while last.next is not None:
        sec_last = last
        last = last.next

    # Change the next of second last node to None
    sec_last.next = None

    # Make the last node as the new head
    last.next = head
    head = last

    return head

def print_list(node):
    while node is not None:
        print(node.data, end=" ")
        node = node.next
    print()

# Create a linked list 1->2->3->4->5
head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = Node(4)
head.next.next.next.next = Node(5)

print("Linked list before:")
print_list(head)

head = move_to_front(head)

print("Linked list after:")
print_list(head)
C#
// C# Program to move last element
// to front in a given linked list

class Node {
    public int data;
    public Node next;
    
    public Node(int x) {
        data = x;
        next = null;
    }
}

class GfG {
    
    // Function to move the last node to the 
    // front of the linked list
    static Node MoveToFront(Node head) {
      
        // If the list is empty or has only one node, 
        // no need to move
        if (head == null || head.next == null) {
            return head;
        }
      
        // To keep track of the second last node
        Node secLast = null; 
        
        // To traverse to the last node
        Node last = head;    

        // Traverse the list to find the last and 
        // second last nodes
        while (last.next != null) {
            secLast = last;
            last = last.next;
        }

        // Change the next of second last node to null
        secLast.next = null;

        // Make the last node as the new head
        last.next = head;
        head = last;

        return head;
    }

    static void PrintList(Node node) {
        while (node != null) {
            System.Console.Write(node.data + " ");
            node = node.next;
        }
        System.Console.WriteLine();
    }

    public static void Main() {
      
        // Create a linked list 1->2->3->4->5
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(3);
        head.next.next.next = new Node(4);
        head.next.next.next.next = new Node(5);

        System.Console.WriteLine("Linked list before:");
        PrintList(head);

        head = MoveToFront(head);

        System.Console.WriteLine("Linked list after:");
        PrintList(head);
    }
}
JavaScript
// Javascript Program to move last element to
// front in a given linked list

class Node {
    constructor(data) {
        this.data = data;
        this.next = null;
    }
}

// Function to move the last 
// node to the front of the linked list
function moveToFront(head) {

    // If the list is empty or has 
    // only one node, no need to move
    if (head === null || head.next === null) {
        return head;
    }
	
    // To keep track of the second last node
    let secLast = null; 
    // To traverse to the last node
    let last = head;    

    // Traverse the list to find the last 
    // and second last nodes
    while (last.next !== null) {
        secLast = last;
        last = last.next;
    }

    // Change the next of second last node to null
    secLast.next = null;

    // Make the last node as the new head
    last.next = head;
    head = last;

    return head;
}

function printList(node) {
    while (node !== null) {
        process.stdout.write(node.data + " ");
        node = node.next;
    }
    console.log();
}

let head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);

console.log("Linked list before:");
printList(head);

head = moveToFront(head);

console.log("Linked list after:");
printList(head);

Output
Linked list before: 
1 2 3 4 5 
Linked list after: 
5 1 2 3 4 

Time Complexity: O(n), As we need to traverse the list once.
Auxiliary Space: O(1)



Next Article
Article Tags :
Practice Tags :

Similar Reads