📌  相关文章
📜  将最后 m 个元素移动到给定链表的前面

📅  最后修改于: 2022-05-13 01:57:45.376000             🧑  作者: Mango

将最后 m 个元素移动到给定链表的前面

给定一个单向链表的头部和一个值m ,任务是将最后 m 个元素移到前面。
例子:

算法:

  1. 使用两个指针:一个存储最后一个节点的地址,另一个存储第一个节点的地址。
  2. 遍历列表直到最后 m 个节点的第一个节点。
  3. 维护两个指针 p, q ,即 p 作为最后 m 个节点的第一个节点 & q 作为 p 的节点之前。
  4. 将最后一个节点作为原始列表头。
  5. 使节点 q 的下一个为 NULL。
  6. 将 p 设置为头部。

下面是上述方法的实现。



C++
// C++ Program to move last m elements
// to front in a given linked list
#include 
using namespace std;
 
// A linked list node
struct Node
{
    int data;
    struct Node* next;
} * first, *last;
 
int length = 0;
 
// Function to print nodes
// in a given linked list
void printList(struct Node* node)
{
    while (node != NULL)
    {
        cout << node->data <<" ";
        node = node->next;
    }
}
 
// Pointer head and p are being
// used here because, the head
// of the linked list is changed in this function.
void moveToFront(struct Node* head,
                struct Node* p, int m)
{
    // If the linked list is empty,
    // or it contains only one node,
    // then nothing needs to be done, simply return
    if (head == NULL)
        return;
 
    p = head;
    head = head->next;
    m++;
 
    // if m value reaches length,
    // the recursion will end
    if (length == m)
    {
 
        // breaking the link
        p->next = NULL;
 
        // connecting last to first &
        // will make another node as head
        last->next = first;
 
        // Making the first node of
        // last m nodes as root
        first = head;
    }
    else
        moveToFront(head, p, m);
}
 
// UTILITY FUNCTIONS
 
// Function to add a node at
// the beginning of Linked List
void push(struct Node** head_ref,
        int new_data)
{
    // allocate node
    struct Node* new_node = (struct Node*)
        malloc(sizeof(struct Node));
 
    // put in the data
    new_node->data = new_data;
 
    // link the old list off the new node
    new_node->next = (*head_ref);
 
    // move the head to point to the new node
    (*head_ref) = new_node;
 
    // making first & last nodes
    if (length == 0)
        last = *head_ref;
    else
        first = *head_ref;
 
    // increase the length
    length++;
}
 
// Driver code
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);
    push(&start, 0);
 
    cout << "Initial Linked list\n";
    printList(start);
    int m = 4; // no.of nodes to change
    struct Node* temp;
    moveToFront(start, temp, m);
 
    cout << "\n Final Linked list\n";
    start = first;
    printList(start);
 
    return 0;
}
 
// This code is contributed by SHUBHAMSINGH10


C
// C Program to move last m elements
// to front in a given linked list
#include 
#include 
 
// A linked list node
struct Node {
    int data;
    struct Node* next;
} * first, *last;
 
int length = 0;
 
// Function to print nodes
// in a given linked list
void printList(struct Node* node)
{
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}
 
// Pointer head and p are being
// used here because, the head
// of the linked list is changed in this function.
void moveToFront(struct Node* head,
                 struct Node* p, int m)
{
    // If the linked list is empty,
    // or it contains only one node,
    // then nothing needs to be done, simply return
    if (head == NULL)
        return;
 
    p = head;
    head = head->next;
    m++;
 
    // if m value reaches length,
    // the recursion will end
    if (length == m) {
 
        // breaking the link
        p->next = NULL;
 
        // connecting last to first &
        // will make another node as head
        last->next = first;
 
        // Making the first node of
        // last m nodes as root
        first = head;
    }
    else
        moveToFront(head, p, m);
}
 
// UTILITY FUNCTIONS
 
// Function to add a node at
// the beginning of Linked List
void push(struct Node** head_ref,
          int new_data)
{
    // allocate node
    struct Node* new_node = (struct Node*)
        malloc(sizeof(struct Node));
 
    // put in the data
    new_node->data = new_data;
 
    // link the old list off the new node
    new_node->next = (*head_ref);
 
    // move the head to point to the new node
    (*head_ref) = new_node;
 
    // making first & last nodes
    if (length == 0)
        last = *head_ref;
    else
        first = *head_ref;
 
    // increase the length
    length++;
}
 
// Driver code
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);
    push(&start, 0);
 
    printf("\n Initial Linked list\n");
    printList(start);
    int m = 4; // no.of nodes to change
    struct Node* temp;
    moveToFront(start, temp, m);
 
    printf("\n Final Linked list\n");
    start = first;
    printList(start);
 
    return 0;
}


Java
// Java Program to move last m elements
// to front in a given linked list
class GFG
{
    // A linked list node
    static class Node
    {
        int data;
        Node next;
    }
 
    static Node first, last;
 
    static int length = 0;
 
    // 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;
        }
    }
 
    // Pointer head and p are being
    // used here because, the head
    // of the linked list is changed in this function.
    static void moveToFront(Node head, Node p, int m)
    {
        // If the linked list is empty,
        // or it contains only one node,
        // then nothing needs to be done, simply return
        if (head == null)
            return;
 
        p = head;
        head = head.next;
        m++;
 
        // if m value reaches length,
        // the recursion will end
        if (length == m)
        {
 
            // breaking the link
            p.next = null;
 
            // connecting last to first &
            // will make another node as head
            last.next = first;
 
            // Making the first node of
            // last m nodes as root
            first = head;
        }
        else
            moveToFront(head, p, m);
    }
 
    // UTILITY FUNCTIONS
 
    // Function to add a node at
    // the beginning of Linked List
    static Node push(Node head_ref, int new_data)
    {
        // allocate node
        Node new_node = new Node();
 
        // put in the data
        new_node.data = new_data;
 
        // link the old list off the new node
        new_node.next = head_ref;
 
        // move the head to point to the new node
        head_ref = new_node;
 
        // making first & last nodes
        if (length == 0)
            last = head_ref;
        else
            first = head_ref;
 
        // increase the length
        length++;
        return head_ref;
    }
 
    // 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);
        start = push(start, 0);
 
        System.out.printf("\n Initial Linked list\n");
        printList(start);
        int m = 4; // no.of nodes to change
        Node temp = new Node();
        moveToFront(start, temp, m);
 
        System.out.printf("\n Final Linked list\n");
        start = first;
        printList(start);
    }
}
 
// This code is contributed by 29AjayKumar


Python3
# Python Program to move last m elements
# to front in a given linked list
 
# A linked list node
class Node :
    def __init__(self):
        self.data = 0
        self.next = None
         
first = None
last = None
 
length = 0
 
# Function to print nodes
# in a given linked list
def printList( node):
 
    while (node != None) :
        print( node.data, end=" ")
        node = node.next
     
# Pointer head and p are being
# used here because, the head
# of the linked list is changed in this function.
def moveToFront( head, p, m):
     
    global first
    global last
    global length
     
    # If the linked list is empty,
    # or it contains only one node,
    # then nothing needs to be done, simply return
    if (head == None):
        return head
 
    p = head
    head = head.next
    m= m + 1
 
    # if m value reaches length,
    # the recursion will end
    if (length == m) :
     
        # breaking the link
        p.next = None
 
        # connecting last to first &
        # will make another node as head
        last.next = first
         
        # Making the first node of
        # last m nodes as root
        first = head
     
    else:
        moveToFront(head, p, m)
         
# UTILITY FUNCTIONS
 
# Function to add a node at
# the beginning of Linked List
def push( head_ref, new_data):
     
    global first
    global last
    global length
     
    # allocate node
    new_node = Node()
     
    # put in the data
    new_node.data = new_data
 
    # link the old list off the new node
    new_node.next = (head_ref)
 
    # move the head to point to the new node
    (head_ref) = new_node
     
    # making first & last nodes
    if (length == 0):
        last = head_ref
    else:
        first = head_ref
 
    # increase the length
    length= length + 1
     
    return head_ref
 
# 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)
start = push(start, 0)
 
print("\n Initial Linked list")
printList(start)
m = 4 # no.of nodes to change
temp = None
moveToFront(start, temp, m)
 
print("\n Final Linked list")
start = first
printList(start)
 
# This code is contributed by Arnab Kundu


C#
// C# Program to move last m elements
// to front in a given linked list
using System;
 
class GFG
{
    // A linked list node
    class Node
    {
        public int data;
        public Node next;
    }
 
    static Node first, last;
 
    static int length = 0;
 
    // 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;
        }
    }
 
    // Pointer head and p are being used here
    // because, the head of the linked list
    // is changed in this function.
    static void moveToFront(Node head,
                            Node p, int m)
    {
        // If the linked list is empty,
        // or it contains only one node,
        // then nothing needs to be done,
        // simply return
        if (head == null)
            return;
 
        p = head;
        head = head.next;
        m++;
 
        // if m value reaches length,
        // the recursion will end
        if (length == m)
        {
 
            // breaking the link
            p.next = null;
 
            // connecting last to first &
            // will make another node as head
            last.next = first;
 
            // Making the first node of
            // last m nodes as root
            first = head;
        }
        else
            moveToFront(head, p, m);
    }
 
    // UTILITY FUNCTIONS
 
    // Function to add a node at
    // the beginning of Linked List
    static Node push(Node head_ref, int new_data)
    {
        // allocate node
        Node new_node = new Node();
 
        // put in the data
        new_node.data = new_data;
 
        // link the old list off the new node
        new_node.next = head_ref;
 
        // move the head to point to the new node
        head_ref = new_node;
 
        // making first & last nodes
        if (length == 0)
            last = head_ref;
        else
            first = head_ref;
 
        // increase the length
        length++;
        return head_ref;
    }
 
    // 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);
        start = push(start, 0);
 
        Console.Write("Initial Linked list\n");
        printList(start);
        int m = 4; // no.of nodes to change
        Node temp = new Node();
        moveToFront(start, temp, m);
 
        Console.Write("\nFinal Linked list\n");
        start = first;
        printList(start);
    }
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:
Initial Linked list
0 1 2 3 4 5 
 Final Linked list
2 3 4 5 0 1

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程