📜  将给定的链表分成大小比例为 p:q 的两个列表

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

将给定的链表分成大小比例为 p:q 的两个列表

给定一个链表和两个整数pq ,任务是以p:q的比例划分链表,即第一个列表包含来自原始列表的前p 个节点,第二个列表包含其余的q 个节点。如果原始列表不能以给定的比例拆分,则打印-1
例子:

方法:先求链表的长度。如果总比率和超过实际长度,则无法划分列表,因此打印-1 。如果可以划分列表,则只需遍历列表直至长度为p并将其分解为比率p:q 。下一个节点将是第二个列表的头部,然后打印两个列表。
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include
using namespace std;
 
struct Node
{
    int data;
    Node *next;
 
    Node(int data)
    {
        this->data = data;
        this->next = NULL;
    }
};
 
void printList(Node *);
 
// Function to split the given linked list
// into ratio of p and q
void splitAndPrint(Node *head, int p, int q)
{
  int n = 0;
  Node *temp;
  temp = head;
 
  // Find the length of the list
  while (temp != NULL)
  {
    n += 1;
    temp = temp->next;
  }
 
  // If ration exceeds the actual length
  if (p + q > n)
  {
    cout << "-1" << endl;
    return;
  }
  temp = head;
  while (p > 1)
  {
    temp = temp->next;
    p -= 1;
  }
 
  // second head node after splitting
  Node *head2 = temp->next;
  temp->next = NULL;
 
  // Print first linked list
  printList(head);
  cout << endl;
 
  // Print second linked list
  printList(head2);
}
 
// Function to print the nodes
// of the linked list
void printList(Node* head)
{
  if (head == NULL)
    return;
  cout << head->data << " ";
  printList(head->next);
}
 
// Driver code
int main()
{
  Node* head = new Node(1);
  head->next = new Node(3);
  head->next->next = new Node(5);
  head->next->next->next = new Node(6);
  head->next->next->next->next = new Node(7);
  head->next->next->next->next->next = new Node(2);
 
  int p = 2, q = 4;
  splitAndPrint(head, p, q);
}
 
// This code is contributed by rutvik_56.


Java
// Java implementation of the approach
class GFG
{
     
// Node
static class Node
{
    int data;
    Node next;
    Node(int data)
    {
        this.data = data;
    }
}
 
// Function to split the given linked list
// into ratio of p and q
static void splitAndPrint(Node head,int p,int q)
{
    int n = 0;
    Node temp;
    temp = head;
     
    // Find the length of the list
    while(temp!=null)
    {
        n += 1;
        temp = temp.next;
    }
     
    // If ration exceeds the actual length
    if (p + q > n)
    {
        System.out.println("-1");
        return;
    }
    temp = head;
    while(p > 1)
    {
        temp = temp.next;
        p-= 1;
    }
     
    // second head node after splitting
    Node head2 = temp.next;
    temp.next = null;
     
    // Print first linked list
    printList(head);
    System.out.println();
     
    // Print second linked list
    printList(head2);
}
 
// Function to print the nodes
// of the linked list
static void printList(Node head)
{
    if( head == null)
        return;
    System.out.print(head.data+" , ");
    printList(head.next);
}
 
// Driver code
public static void main(String args[])
{
    Node head = new Node(1);
    head.next = new Node(3);
    head.next.next = new Node(5);
    head.next.next.next = new Node(6);
    head.next.next.next.next = new Node(7);
    head.next.next.next.next.next = new Node(2);
     
    int p =2,q= 4;
    splitAndPrint(head, p, q);
}
}
 
// This code is contributed by Arnab Kundu


Python
# Python3 implementation of the approach
 
# Linked List node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Function to split the given linked list
# into ratio of p and q
def splitAndPrint(head, p, q):
    n, temp = 0, head
     
    # Find the length of the list
    while(temp):
        n += 1
        temp = temp.next
     
    # If ration exceeds the actual length
    if p + q>n:
        print("-1")
        return
 
    temp = head
    while(p>1):
        temp = temp.next
        p-= 1
     
    # second head node after splitting
    head2 = temp.next
    temp.next = None
     
    # Print first linked list
    printList(head)
    print()
     
    # Print second linked list
    printList(head2)
 
# Function to print the nodes
# of the linked list
def printList(head):
    if not head:
        return
    print("{} ".format(head.data), end ="")
    printList(head.next)
 
# Driver code
head = Node(1)
head.next = Node(3)
head.next.next = Node(5)
head.next.next.next = Node(6)
head.next.next.next.next = Node(7)
head.next.next.next.next.next = Node(2)
 
p, q = 2, 4
splitAndPrint(head, p, q)


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
public class Node
{
    public int data;
    public Node next;
    public Node(int data)
    {
        this.data = data;
    }
}
 
// Function to split the given linked list
// into ratio of p and q
static void splitAndPrint(Node head,int p,int q)
{
    int n = 0;
    Node temp;
    temp = head;
     
    // Find the length of the list
    while(temp != null)
    {
        n += 1;
        temp = temp.next;
    }
     
    // If ration exceeds the actual length
    if (p + q > n)
    {
        Console.WriteLine("-1");
        return;
    }
    temp = head;
    while(p > 1)
    {
        temp = temp.next;
        p-= 1;
    }
     
    // second head node after splitting
    Node head2 = temp.next;
    temp.next = null;
     
    // Print first linked list
    printList(head);
    Console.WriteLine();
     
    // Print second linked list
    printList(head2);
}
 
// Function to print the nodes
// of the linked list
static void printList(Node head)
{
    if( head == null)
        return;
    Console.Write(head.data+" ");
    printList(head.next);
}
 
// Driver code
public static void Main(String []args)
{
    Node head = new Node(1);
    head.next = new Node(3);
    head.next.next = new Node(5);
    head.next.next.next = new Node(6);
    head.next.next.next.next = new Node(7);
    head.next.next.next.next.next = new Node(2);
     
    int p = 2, q = 4;
    splitAndPrint(head, p, q);
}
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出:

1 3 
5 6 7 2

时间复杂度: O(N)
辅助空间: O(1)

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