📜  查找两个双向链表中的公共节点数

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

查找两个双向链表中的公共节点数

给定两个双向链表。任务是查找双向链表中公共节点的总数。
例子:

Input : 
list 1 = 15 <=> 16 <=> 10 <=> 9 <=> 6 <=> 7 <=> 17 
list 2 = 15 <=> 16 <=> 45 <=> 9 <=> 6
Output : Number of common nodes: 4

Input :
list 1 = 18 <=> 30 <=> 92 <=> 46 <=> 72 <=> 1
list 2 = 12 <=> 32 <=> 45 <=> 9 <=> 6 <=> 30
Output : Number of common nodes: 1

方法:使用两个嵌套循环遍历两个列表直到列表末尾。对于列表 1 中的每个节点,检查它是否与列表 2 中的任何节点匹配。如果是,则增加公共节点的计数。最后,打印计数。
下面是上述方法的实现:

C++
// C++ implementation to count
// common element in given two
// doubly linked list
#include 
 
using namespace std;
 
// Node of the doubly linked list
struct Node {
    int data;
    Node *prev, *next;
};
 
// Function to insert a node at the beginning
// of the Doubly Linked List
void push(Node** head_ref, int new_data)
{
    // allocate node
    Node* new_node = (Node*)malloc(sizeof(struct Node));
 
    // put in the data
    new_node->data = new_data;
 
    // since we are adding at the beginning,
    // prev is always NULL
    new_node->prev = NULL;
 
    // link the old list off the new node
    new_node->next = (*head_ref);
 
    // change prev of head node to new node
    if ((*head_ref) != NULL)
        (*head_ref)->prev = new_node;
 
    // move the head to point to the new node
    (*head_ref) = new_node;
}
 
// Count common nodes in both list1 and list 2
int countCommonNodes(Node** head_ref, Node** head)
{
    // head for list 1
    Node* ptr = *head_ref;
 
    // head for list 2
    Node* ptr1 = *head;
 
    // initialize count = 0
    int count = 0;
 
    // traverse list 1 till the end
    while (ptr != NULL) {
        // traverse list 2 till the end
        while (ptr1 != NULL) {
            // if node value is equal then
            // increment count
            if (ptr->data == ptr1->data) {
                count++;
                break;
            }
 
            // increment pointer list 2
            ptr1 = ptr1->next;
        }
 
        // again list 2 start with starting point
        ptr1 = *head;
 
        // increment pointer list 1
        ptr = ptr->next;
    }
 
    // return count of common nodes
    return count;
}
 
// Driver program
int main()
{
    // start with the empty list
    Node* head = NULL;
    Node* head1 = NULL;
 
    // create the doubly linked list 1
    // 15 <-> 16 <-> 10 <-> 9 <-> 6 <-> 7 <-> 17
    push(&head, 17);
    push(&head, 7);
    push(&head, 6);
    push(&head, 9);
    push(&head, 10);
    push(&head, 16);
    push(&head, 15);
 
    // create the doubly linked list 2
    // 15 <-> 16 <-> 45 <-> 9 <-> 6
    push(&head1, 6);
    push(&head1, 9);
    push(&head1, 45);
    push(&head1, 16);
    push(&head1, 15);
 
    cout << "Number of common nodes:"
         << countCommonNodes(&head, &head1);
 
    return 0;
}


Java
// Java implementation to count
// common element in given two
// doubly linked list
class GFG
{
 
// Node of the doubly linked list
static class Node
{
    int data;
    Node prev, next;
};
 
// Function to insert a node at the beginning
// of the Doubly 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;
 
    // since we are adding at the beginning,
    // prev is always null
    new_node.prev = null;
 
    // link the old list off the new node
    new_node.next = head_ref;
 
    // change prev of head node to new node
    if (head_ref != null)
        head_ref.prev = new_node;
 
    // move the head to point to the new node
    head_ref = new_node;
    return head_ref;
}
 
// Count common nodes in both list1 and list 2
static int countCommonNodes(Node head_ref,
                            Node head)
{
    // head for list 1
    Node ptr = head_ref;
 
    // head for list 2
    Node ptr1 = head;
 
    // initialize count = 0
    int count = 0;
 
    // traverse list 1 till the end
    while (ptr != null)
    {
         
        // traverse list 2 till the end
        while (ptr1 != null)
        {
             
            // if node value is equal then
            // increment count
            if (ptr.data == ptr1.data)
            {
                count++;
                break;
            }
 
            // increment pointer list 2
            ptr1 = ptr1.next;
        }
 
        // again list 2 start with starting point
        ptr1 = head;
 
        // increment pointer list 1
        ptr = ptr.next;
    }
 
    // return count of common nodes
    return count;
}
 
// Driver Code
public static void main(String[] args)
{
    // start with the empty list
    Node head = null;
    Node head1 = null;
 
    // create the doubly linked list 1
    // 15 <. 16 <. 10 <. 9 <. 6 <. 7 <. 17
    head = push(head, 17);
    head = push(head, 7);
    head = push(head, 6);
    head = push(head, 9);
    head = push(head, 10);
    head = push(head, 16);
    head = push(head, 15);
 
    // create the doubly linked list 2
    // 15 <. 16 <. 45 <. 9 <. 6
    head1 = push(head1, 6);
    head1 = push(head1, 9);
    head1 = push(head1, 45);
    head1 = push(head1, 16);
    head1 = push(head1, 15);
 
    System.out.println("Number of common nodes: " +
                        countCommonNodes(head, head1));
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 implementation to count
# common element in given two
# 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 insert a node at the beginning
# of the Doubly Linked List
def push(head_ref, new_data):
     
    # allocate node
    new_node = Node(new_data)
  
    # put in the data
    new_node.data = new_data;
  
    # since we are adding at the beginning,
    # prev is always None
    new_node.prev = None;
  
    # link the old list off the new node
    new_node.next = (head_ref);
  
    # change prev of head node to new node
    if ((head_ref) != None):
        (head_ref).prev = new_node;
  
    # move the head to point to the new node
    (head_ref) = new_node;   
    return head_ref
 
# Count common nodes in both list1 and list 2
def countCommonNodes(head_ref, head):
 
    # head for list 1
    ptr = head_ref;
  
    # head for list 2
    ptr1 = head;
  
    # initialize count = 0
    count = 0;
  
    # traverse list 1 till the end
    while (ptr != None):
       
        # traverse list 2 till the end
        while (ptr1 != None):
           
            # if node value is equal then
            # increment count
            if (ptr.data == ptr1.data):
                count += 1
                break;
         
            # increment pointer list 2
            ptr1 = ptr1.next;
  
        # again list 2 start with starting point
        ptr1 = head;
  
        # increment pointer list 1
        ptr = ptr.next;
  
    # return count of common nodes
    return count;
  
# Driver program
if __name__=='__main__':
     
    # start with the empty list
    head = None;
    head1 = None;
  
    # create the doubly linked list 1
    # 15 <. 16 <. 10 <. 9 <. 6 <. 7 <. 17
    head = push(head, 17);
    head = push(head, 7);
    head = push(head, 6);
    head = push(head, 9);
    head = push(head, 10);
    head = push(head, 16);
    head = push( head, 15);
  
    # create the doubly linked list 2
    # 15 <. 16 <. 45 <. 9 <. 6
    head1 = push(head1, 6);
    head1 = push(head1, 9);
    head1 = push(head1, 45);
    head1 = push(head1, 16);
    head1 = push(head1, 15);
  
    print("Number of common nodes: " + str(countCommonNodes(head, head1)))
          
# This code is contributed by rutvik_56.


C#
// C# implementation to count
// common element in given two
// doubly linked list
using System;
     
class GFG
{
 
// Node of the doubly linked list
public class Node
{
    public int data;
    public Node prev, next;
};
 
// Function to insert a node at the beginning
// of the Doubly 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;
 
    // since we are adding at the beginning,
    // prev is always null
    new_node.prev = null;
 
    // link the old list off the new node
    new_node.next = head_ref;
 
    // change prev of head node to new node
    if (head_ref != null)
        head_ref.prev = new_node;
 
    // move the head to point to the new node
    head_ref = new_node;
    return head_ref;
}
 
// Count common nodes in both list1 and list 2
static int countCommonNodes(Node head_ref,
                            Node head)
{
    // head for list 1
    Node ptr = head_ref;
 
    // head for list 2
    Node ptr1 = head;
 
    // initialize count = 0
    int count = 0;
 
    // traverse list 1 till the end
    while (ptr != null)
    {
         
        // traverse list 2 till the end
        while (ptr1 != null)
        {
             
            // if node value is equal then
            // increment count
            if (ptr.data == ptr1.data)
            {
                count++;
                break;
            }
 
            // increment pointer list 2
            ptr1 = ptr1.next;
        }
 
        // again list 2 start with starting point
        ptr1 = head;
 
        // increment pointer list 1
        ptr = ptr.next;
    }
 
    // return count of common nodes
    return count;
}
 
// Driver Code
public static void Main(String[] args)
{
    // start with the empty list
    Node head = null;
    Node head1 = null;
 
    // create the doubly linked list 1
    // 15 <. 16 <. 10 <. 9 <. 6 <. 7 <. 17
    head = push(head, 17);
    head = push(head, 7);
    head = push(head, 6);
    head = push(head, 9);
    head = push(head, 10);
    head = push(head, 16);
    head = push(head, 15);
 
    // create the doubly linked list 2
    // 15 <. 16 <. 45 <. 9 <. 6
    head1 = push(head1, 6);
    head1 = push(head1, 9);
    head1 = push(head1, 45);
    head1 = push(head1, 16);
    head1 = push(head1, 15);
 
    Console.WriteLine("Number of common nodes: " +
                   countCommonNodes(head, head1));
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:
Number of common nodes:4