Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में लिंक्ड सूची में लूप की लंबाई पाएं

इस समस्या में, हमें एक लिंक की गई सूची दी जाती है जिसमें लूप हो सकते हैं। हमारा कार्य लिंक्ड सूची में लूप की लंबाई ज्ञात करना है।

समस्या का विवरण: हमें लूप में नोड्स की संख्या गिनने की आवश्यकता है यदि इसमें लूप है अन्यथा -1 लौटाएं।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट: लिंक्ड-लिस्ट :

सी ++ में लिंक्ड सूची में लूप की लंबाई पाएं

आउटपुट: 8

समाधान दृष्टिकोण

समस्या को हल करने के लिए, हमें पहले यह जांचना होगा कि लिंक की गई सूची में लूप है या नहीं। इसे जांचने का एक तरीका फ़्लॉइड के साइकिल फ़ाइंडिंग एल्गोरिथम का उपयोग करना है।

फ़्लॉइड के साइकिल फ़ाइंडिंग एल्गोरिथम में, हम दो पॉइंटर्स का उपयोग करके लिंक की गई सूची को पार करेंगे। एक धीमा सूचक जो 1 से बढ़ता है और दूसरा fastPointer . है जो 2 से बढ़ जाता है। यदि दोनों संख्याएँ किसी बिंदु पर मिलती हैं तो एक लूप मौजूद होता है अन्यथा नहीं।

यदि कोई लूप मौजूद है, तो हमें लूप में मौजूद नोड्स की संख्या गिनने की आवश्यकता है। इसके लिए हम उस बिंदु से शुरू करेंगे जहां slowPointer और फास्टपॉइंटर मिलें और फिर स्थिति में वापस आने के लिए ट्रैवर्स किए गए नोड्स की संख्या गिनें।

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

उदाहरण

#include<bits/stdc++.h>
using namespace std;

struct Node {
   int data;
   struct Node* next;
};

int countLoopNodespoint(struct Node *n) {
   int res = 1;
   struct Node *temp = n;
   while (temp->next != n) {
     
      res++;
      temp = temp->next;
   }
   return res;
}

int countLoopNode(struct Node *list) {
   
   struct Node *slowPtr = list, *fastPtr = list;
   while (slowPtr && fastPtr && fastPtr->next) {
      slowPtr = slowPtr->next;
      fastPtr = fastPtr->next->next;

      if (slowPtr == fastPtr)
         return countLoopNodespoint(slowPtr);
   }
   return 0;
}

struct Node *newNode(int key) {
   struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
   temp->data = key;
   temp->next = NULL;
   return temp;
}

int main() {
   struct Node *head = newNode(1);
   head->next = newNode(2);
   head->next->next = newNode(3);
   head->next->next->next = newNode(4);
   head->next->next->next->next = newNode(5);
   head->next->next->next->next->next = newNode(6);
   head->next->next->next->next->next->next = newNode(7);
   head->next->next->next->next->next->next->next = head->next;

   cout<<"The number of nodes in the loop are "<<countLoopNode(head);

   return 0;
}

आउटपुट

The number of nodes in the loop are 6>]
है
  1. सी प्रोग्राम लिंक्ड लिस्ट की लंबाई ज्ञात करने के लिए

    लिंक्ड सूचियाँ गतिशील मेमोरी आवंटन का उपयोग करती हैं अर्थात वे उसी के अनुसार बढ़ती और सिकुड़ती हैं। उन्हें नोड्स के संग्रह के रूप में परिभाषित किया गया है। यहां, नोड्स के दो भाग होते हैं, जो डेटा और लिंक हैं। डेटा, लिंक और लिंक्ड सूचियों का प्रतिनिधित्व नीचे दिया गया है - लिंक की गई सूचियों के प्र

  1. सी ++ में एक लिंक्ड सूची को समतल करना

    इस समस्या में, हमें दो पॉइंटर नोड्स वाली लिंक्ड लिस्ट दी जाती है, दाएं और नीचे। दायां नोड मुख्य लिंक्ड सूची सूचक है। डाउन नोड उस नोड से शुरू होने वाली सेकेंडरी लिंक्ड लिस्ट के लिए है। सभी लिंक की गई सूचियां क्रमबद्ध हैं। हमारा काम एक लिंक की गई सूची को समतल करने के लिए एक प्रोग्राम बनाना ह

  1. सी++ में डबल लिंक्ड लिस्ट का आकार खोजने का कार्यक्रम

    इस समस्या में हमें एक डबल लिंक्ड लिस्ट दी जाती है। हमारा काम C++ में डबली लिंक्ड लिस्ट का आकार खोजने के लिए एक प्रोग्राम बनाना है। डबल लिंक्ड लिस्ट एक विशेष प्रकार की लिंक्ड लिस्ट है जिसमें सिंगल लिंक्ड लिस्ट की तुलना में आगे और पीछे दोनों तरह से नेविगेशन संभव है। डबल लिंक्ड सूचियों की अवधारणा को