📜  给定随机指针时插入已排序的循环链表

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

给定随机指针时插入已排序的循环链表

给定一个整数数组arr[]和一个指向循环排序链表(初始为空)的随机节点的指针,任务是将arr[] 的所有元素插入到循环链表中。

例子:

方法:我们得到一个指向循环链表中一个节点的随机指针,我们必须找到循环链表的头部才能将该节点插入到一个有序链表中。
这篇文章解释了在给出头部时在排序链表中的插入。
要找到循环排序链表的头部:



  • 找到链表的最后一个节点(最后一个节点将大于其后继即第一个元素。
  • 一旦找到链表的头部,就可以使用上一篇文章中讨论的相同方法插入元素。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Node structure
struct Node {
    Node* next;
    int data;
};
 
// Function to create a node
Node* create()
{
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->next = NULL;
 
    return new_node;
}
 
// Function to find and return the head
Node* find_head(Node* random)
{
    // If the list is empty
    if (random == NULL)
        return NULL;
 
    Node *head, *var = random;
 
    // Finding the last node of the linked list
    // the last node must have the highest value
    // if no such element is present then all the nodes
    // of the linked list must be same
    while (!(var->data > var->next->data || var->next == random)) {
        var = var->next;
    }
 
    // Return the head
    return var->next;
}
 
// Function to insert a new_node in the list in sorted fashion
// Note that this function expects a pointer to head node
// as this can modify the head of the input linked list
Node* sortedInsert(Node* head_ref, Node* new_node)
{
    Node* current = head_ref;
 
    // If the list is empty
    if (current == NULL) {
        new_node->next = new_node;
        head_ref = new_node;
    }
 
    // If the node to be inserted is the smallest
    // then it has to be the new head
    else if (current->data >= new_node->data) {
 
        // Find the last node of the list as it
        // will be pointing to the head
        while (current->next != head_ref)
            current = current->next;
        current->next = new_node;
        new_node->next = head_ref;
        head_ref = new_node;
    }
 
    else {
        // Locate the node before the point of insertion
        while (current->next != head_ref
               && current->next->data < new_node->data) {
            current = current->next;
        }
 
        new_node->next = current->next;
        current->next = new_node;
    }
 
    // Return the new head
    return head_ref;
}
 
// Function to print the nodes of the linked list
void printList(Node* start)
{
    Node* temp;
 
    if (start != NULL) {
        temp = start;
        do {
            cout << temp->data << " ";
            temp = temp->next;
        } while (temp != start);
    }
}
 
// Driver code
int main()
{
 
    int arr[] = { 12, 56, 2, 11, 1, 90 };
    int list_size, i;
 
    // Start with an empty linked list
    Node* start = NULL;
    Node* temp;
 
    // Create linked list from the given array
    for (i = 0; i < 6; i++) {
 
        // Move to a random node if it exists
        if (start != NULL)
            for (int j = 0; j < (rand() % 10); j++)
                start = start->next;
 
        temp = create();
        temp->data = arr[i];
        start = sortedInsert(find_head(start), temp);
    }
 
    // Print the contents of the created list
    printList(find_head(start));
 
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
import java.lang.*;
import java.io.*;
 
class GFG
{
     
// Node structure
static class Node
{
    Node next;
    int data;
};
 
// Function to create a node
static Node create()
{
    Node new_node = new Node();
    new_node.next = null;
 
    return new_node;
}
 
// Function to find and return the head
static Node find_head(Node random)
{
    // If the list is empty
    if (random == null)
        return null;
 
    Node head, var = random;
 
    // Finding the last node of the linked list
    // the last node must have the highest value
    // if no such element is present then all the nodes
    // of the linked list must be same
    while (!(var.data > var.next.data ||
                        var.next == random))
    {
        var = var.next;
    }
 
    // Return the head
    return var.next;
}
 
// Function to insert a new_node in the list
// in sorted fashion. Note that this function
// expects a pointer to head node as this can
// modify the head of the input linked list
static Node sortedInsert(Node head_ref,
                         Node new_node)
{
    Node current = head_ref;
 
    // If the list is empty
    if (current == null)
    {
        new_node.next = new_node;
        head_ref = new_node;
    }
 
    // If the node to be inserted is the smallest
    // then it has to be the new head
    else if (current.data >= new_node.data)
    {
 
        // Find the last node of the list as it
        // will be pointing to the head
        while (current.next != head_ref)
            current = current.next;
        current.next = new_node;
        new_node.next = head_ref;
        head_ref = new_node;
    }
 
    else
    {
        // Locate the node before the point of insertion
        while (current.next != head_ref &&
               current.next.data < new_node.data)
        {
            current = current.next;
        }
        new_node.next = current.next;
        current.next = new_node;
    }
 
    // Return the new head
    return head_ref;
}
 
// Function to print the nodes of the linked list
static void printList(Node start)
{
    Node temp;
 
    if (start != null)
    {
        temp = start;
        do
        {
            System.out.print(temp.data + " ");
            temp = temp.next;
        } while (temp != start);
    }
}
 
// Driver code
public static void main(String args[])
{
 
    int arr[] = { 12, 56, 2, 11, 1, 90 };
    int list_size, i;
 
    // Start with an empty linked list
    Node start = null;
    Node temp;
 
    // Create linked list from the given array
    for (i = 0; i < 6; i++)
    {
 
        // Move to a random node if it exists
        if (start != null)
            for (int j = 0;
                     j < (Math.random() * 10); j++)
                start = start.next;
 
        temp = create();
        temp.data = arr[i];
        start = sortedInsert(find_head(start), temp);
    }
 
    // Print the contents of the created list
    printList(find_head(start));
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 implementation of the approach
from random import randint
 
# Node structure
class Node:
 
    def __init__(self):
 
        self.next = None
        self.data = 0
   
# Function to create a node
def create():
 
    new_node = Node()
    new_node.next = None
    return new_node
 
# Function to find and return the head
def find_head(random):
 
    # If the list is empty
    if (random == None):
        return None
 
    head = None
    var = random
 
    # Finding the last node of the linked list
    # the last node must have the highest value
    # if no such element is present then all
    # the nodes of the linked list must be same
    while (not(var.data > var.next.data or
               var.next == random)):
        var = var.next
     
    # Return the head
    return var.next
 
# Function to insert a new_node in the list in
# sorted fashion. Note that this function expects
# a pointer to head node as this can modify the
# head of the input linked list
def sortedInsert(head_ref, new_node):
 
    current = head_ref
 
    # If the list is empty
    if (current == None):
        new_node.next = new_node
        head_ref = new_node
 
    # If the node to be inserted is the smallest
    # then it has to be the new head
    elif (current.data >= new_node.data):
 
        # Find the last node of the list as it
        # will be pointing to the head
        while (current.next != head_ref):
            current = current.next
             
        current.next = new_node
        new_node.next = head_ref
        head_ref = new_node
 
    else:
         
        # Locate the node before the point of insertion
        while (current.next != head_ref and
               current.next.data < new_node.data):
            current = current.next
 
        new_node.next = current.next
        current.next = new_node
 
    # Return the new head
    return head_ref
 
# Function to print the nodes of the linked list
def printList(start):
 
    temp = 0
 
    if (start != None):
        temp = start
 
        while True:
            print(temp.data, end = ' ')
            temp = temp.next
             
            if (temp == start):
                break
 
# Driver code
if __name__=='__main__':
 
    arr = [ 12, 56, 2, 11, 1, 90 ]
 
    # Start with an empty linked list
    start = None;
    temp = 0
 
    # Create linked list from the given array
    for i in range(6):
 
        # Move to a random node if it exists
        if (start != None):
            for j in range(randint(0, 10)):
                start = start.next
 
        temp = create()
        temp.data = arr[i]
        start = sortedInsert(find_head(start), temp)
 
    # Print the contents of the created list
    printList(find_head(start))
  
# This code is contributed by rutvik_56


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
// Node structure
public class Node
{
    public Node next;
    public int data;
};
 
// Function to create a node
static Node create()
{
    Node new_node = new Node();
    new_node.next = null;
 
    return new_node;
}
 
// Function to find and return the head
static Node find_head(Node random)
{
    // If the list is empty
    if (random == null)
        return null;
 
    Node var = random;
 
    // Finding the last node of the linked list
    // the last node must have the highest value
    // if no such element is present then all the nodes
    // of the linked list must be same
    while (!(var.data > var.next.data ||
                        var.next == random))
    {
        var = var.next;
    }
 
    // Return the head
    return var.next;
}
 
// Function to insert a new_node in the list
// in sorted fashion. Note that this function
// expects a pointer to head node as this can
// modify the head of the input linked list
static Node sortedInsert(Node head_ref,
                        Node new_node)
{
    Node current = head_ref;
 
    // If the list is empty
    if (current == null)
    {
        new_node.next = new_node;
        head_ref = new_node;
    }
 
    // If the node to be inserted is the smallest
    // then it has to be the new head
    else if (current.data >= new_node.data)
    {
 
        // Find the last node of the list as it
        // will be pointing to the head
        while (current.next != head_ref)
            current = current.next;
        current.next = new_node;
        new_node.next = head_ref;
        head_ref = new_node;
    }
 
    else
    {
        // Locate the node before the point of insertion
        while (current.next != head_ref &&
            current.next.data < new_node.data)
        {
            current = current.next;
        }
        new_node.next = current.next;
        current.next = new_node;
    }
 
    // Return the new head
    return head_ref;
}
 
// Function to print the nodes of the linked list
static void printList(Node start)
{
    Node temp;
 
    if (start != null)
    {
        temp = start;
        do
        {
            Console.Write(temp.data + " ");
            temp = temp.next;
        } while (temp != start);
    }
}
 
// Driver code
public static void Main(String []args)
{
 
    int []arr = { 12, 56, 2, 11, 1, 90 };
    int i;
 
    // Start with an empty linked list
    Node start = null;
    Node temp;
 
    // Create linked list from the given array
    for (i = 0; i < 6; i++)
    {
 
        // Move to a random node if it exists
        if (start != null)
            for (int j = 0;
                    j < (new Random().Next() * 10); j++)
                start = start.next;
 
        temp = create();
        temp.data = arr[i];
        start = sortedInsert(find_head(start), temp);
    }
 
    // Print the contents of the created list
    printList(find_head(start));
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:
1 2 11 12 56 90

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