📜  在排序的双向链表中查找具有给定产品的对

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

在排序的双向链表中查找具有给定产品的对

给定一个正不同元素的排序双向链表,任务是在双向链表中找到乘积等于给定值 x 的对,而不使用任何额外的空间。
例子

Input : List = 1 <=> 2 <=> 4 <=> 5 <=> 6 <=> 8 <=> 9
        x = 8
Output: (1, 8), (2, 4)

Input : List = 1 <=> 2 <=> 3 <=> 4 <=> 5 <=> 6 <=> 7
        x = 6
Output: (1, 6), (2, 3)

解决此问题的一种简单方法是使用两个嵌套循环遍历链表并找到所有对并检查乘积等于 x 的对。此问题的时间复杂度为 O(n^2),n 是双向链表中的节点总数。
此问题的有效解决方案与本文相同。这是算法:

  • 初始化两个指针变量,在已排序的双向链表中查找候选元素。首先以双向链表的开头进行初始化,即; first=head并用双向链表的最后一个节点初始化second ,即;第二=最后一个节点
  • 我们将第一个和第二个指针初始化为第一个和最后一个节点。这里我们没有随机访问,所以要找到第二个指针,我们遍历列表来初始化第二个。
  • 如果 first 和 second 的当前乘积小于 x,那么我们首先向前移动。如果第一个和第二个元素的当前乘积大于 x,那么我们向后移动第二个。
  • 循环终止条件也不同于数组。当两个指针中的任何一个变为 NULL,或者它们相互交叉(second->next = first),或者它们变得相同(first == second)时,循环终止

下面是上述方法的实现:

C++
// C++ program to find a pair with
// given product x in sorted Doubly
// Linked List
#include 
using namespace std;
 
// Doubly Linked List Node
struct Node {
    int data;
    struct Node *next, *prev;
};
 
// Function to find pair whose product
// equal to given value x
void pairProduct(struct Node* head, int x)
{
    // Set two pointers,
    // first to the beginning of DLL
    // and second to the end of DLL.
    struct Node* first = head;
    struct Node* second = head;
    while (second->next != NULL)
        second = second->next;
 
    // To track if we find a pair or not
    bool found = false;
 
    // The loop terminates when either of two pointers
    // become NULL, or they cross each other (second->next
    // == first), or they become same (first == second)
    while (first != NULL && second != NULL && first != second
           && second->next != first) {
        // pair found
        if ((first->data * second->data) == x) {
            found = true;
            cout << "(" << first->data << ", "
                 << second->data << ")" << endl;
 
            // move first in forward direction
            first = first->next;
 
            // move second in backward direction
            second = second->prev;
        }
        else {
            if ((first->data * second->data) < x)
                first = first->next;
            else
                second = second->prev;
        }
    }
 
    // if pair is not present
    if (found == false)
        cout << "No pair found";
}
 
// A utility function to insert a new node at the
// beginning of doubly linked list
void insert(struct Node** head, int data)
{
    struct Node* temp = new Node;
    temp->data = data;
    temp->next = temp->prev = NULL;
    if (!(*head))
        (*head) = temp;
    else {
        temp->next = *head;
        (*head)->prev = temp;
        (*head) = temp;
    }
}
 
// Driver Code
int main()
{
    // Create Doubly Linked List
    struct Node* head = NULL;
    insert(&head, 9);
    insert(&head, 8);
    insert(&head, 6);
    insert(&head, 5);
    insert(&head, 4);
    insert(&head, 2);
    insert(&head, 1);
 
    int x = 8;
 
    pairProduct(head, x);
 
    return 0;
}


Java
// Java program to find a pair with
// given product x in sorted Doubly
// Linked List
 
class GFG {
 
    // Doubly Linked List Node
    static class Node {
        int data;
        Node next, prev;
    };
 
    // Function to find pair whose product
    // equal to given value x
    static void pairProduct(Node head, int x)
    {
        // Set two pointers,
        // first to the beginning of DLL
        // and second to the end of DLL.
        Node first = head;
        Node second = head;
        while (second.next != null)
            second = second.next;
 
        // To track if we find a pair or not
        boolean found = false;
 
        // The loop terminates when either of two pointers
        // become null, or they cross each other (second.next
        // == first), or they become same (first == second)
        while (first != null && second != null && first != second
               && second.next != first) {
            // pair found
            if ((first.data * second.data) == x) {
                found = true;
                System.out.println("(" + first.data + ", "
                                   + second.data + ")");
 
                // move first in forward direction
                first = first.next;
 
                // move second in backward direction
                second = second.prev;
            }
            else {
                if ((first.data * second.data) < x)
                    first = first.next;
                else
                    second = second.prev;
            }
        }
 
        // if pair is not present
        if (found == false)
            System.out.println("No pair found");
    }
 
    // A utility function to insert a new node at the
    // beginning of doubly linked list
    static Node insert(Node head, int data)
    {
        Node temp = new Node();
        temp.data = data;
        temp.next = temp.prev = null;
        if ((head) == null)
            (head) = temp;
        else {
            temp.next = head;
            (head).prev = temp;
            (head) = temp;
        }
        return head;
    }
 
    // Driver Code
    public static void main(String args[])
    {
        // Create Doubly Linked List
        Node head = null;
        head = insert(head, 9);
        head = insert(head, 8);
        head = insert(head, 6);
        head = insert(head, 5);
        head = insert(head, 4);
        head = insert(head, 2);
        head = insert(head, 1);
 
        int x = 8;
 
        pairProduct(head, x);
    }
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 program to find a pair with
# given product x in sorted Doubly
# Linked List
 
# Node of the doubly linked list
class Node:
     
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None
 
# Function to find pair whose product
# equal to given value x
def pairProduct(head, x):
 
    # Set two pointers,
    # first to the beginning of DLL
    # and second to the end of DLL.
    first = head
    second = head
    while (second.next != None):
        second = second.next
 
    # To track if we find a pair or not
    found = False
 
    # The loop terminates when either of two pointers
    # become None, or they cross each other (second.next
    # == first), or they become same (first == second)
    while (first != None and second != None and
           first != second and second.next != first) :
        # pair found
        if ((first.data * second.data) == x) :
            found = True
            print("(", first.data, ", ", second.data, ")")
 
            # move first in forward direction
            first = first.next
 
            # move second in backward direction
            second = second.prev
         
        else :
            if ((first.data * second.data) < x):
                first = first.next
            else:
                second = second.prev
         
    # if pair is not present
    if (found == False):
        print( "No pair found")
 
# A utility function to insert a new node at the
# beginning of doubly linked list
def insert(head, data):
 
    temp = Node(0)
    temp.data = data
    temp.next = temp.prev = None
    if (head == None):
        (head) = temp
    else :
        temp.next = head
        (head).prev = temp
        (head) = temp
    return head
 
# Driver Code
if __name__ == "__main__":
 
    # Create Doubly Linked List
    head = None
    head = insert(head, 9)
    head = insert(head, 8)
    head = insert(head, 6)
    head = insert(head, 5)
    head = insert(head, 4)
    head = insert(head, 2)
    head = insert(head, 1)
 
    x = 8
 
    pairProduct(head, x)
 
# This code is contributed by Arnab Kundu


C#
// C# program to find a pair with
// given product x in sorted Doubly
// Linked List
using System;
 
class GFG {
 
    // Doubly Linked List Node
    public class Node {
        public int data;
        public Node next, prev;
    };
 
    // Function to find pair whose product
    // equal to given value x
    static void pairProduct(Node head, int x)
    {
        // Set two pointers,
        // first to the beginning of DLL
        // and second to the end of DLL.
        Node first = head;
        Node second = head;
        while (second.next != null)
            second = second.next;
 
        // To track if we find a pair or not
        bool found = false;
 
        // The loop terminates when either of two pointers
        // become null, or they cross each other (second.next
        // == first), or they become same (first == second)
        while (first != null && second != null && first != second
               && second.next != first) {
            // pair found
            if ((first.data * second.data) == x) {
                found = true;
                Console.WriteLine("(" + first.data + ", "
                                  + second.data + ")");
 
                // move first in forward direction
                first = first.next;
 
                // move second in backward direction
                second = second.prev;
            }
            else {
                if ((first.data * second.data) < x)
                    first = first.next;
                else
                    second = second.prev;
            }
        }
 
        // if pair is not present
        if (found == false)
            Console.WriteLine("No pair found");
    }
 
    // A utility function to insert a new node at the
    // beginning of doubly linked list
    static Node insert(Node head, int data)
    {
        Node temp = new Node();
        temp.data = data;
        temp.next = temp.prev = null;
        if ((head) == null)
            (head) = temp;
        else {
            temp.next = head;
            (head).prev = temp;
            (head) = temp;
        }
        return head;
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        // Create Doubly Linked List
        Node head = null;
        head = insert(head, 9);
        head = insert(head, 8);
        head = insert(head, 6);
        head = insert(head, 5);
        head = insert(head, 4);
        head = insert(head, 2);
        head = insert(head, 1);
 
        int x = 8;
 
        pairProduct(head, x);
    }
}
 
// This code contributed by Rajput-Ji


Javascript


输出:
(1, 8)
(2, 4)

时间复杂度: O(n)