Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วัฏจักรรายการที่เชื่อมโยง II ใน C++


พิจารณาว่าเรามีรายการเชื่อมโยง และเราต้องตรวจสอบว่ามีวงจรหรือไม่ เพื่อแสดงวัฏจักรในรายการที่เชื่อมโยงที่กำหนด เราจะใช้ตัวชี้จำนวนเต็มหนึ่งตัวที่เรียกว่า pos ตำแหน่งนี้แสดงถึงตำแหน่งในรายการเชื่อมโยงที่มีการเชื่อมต่อหาง ดังนั้นหากตำแหน่งเป็น -1 แสดงว่าไม่มีวงจรอยู่ในรายการที่เชื่อมโยง ตัวอย่างเช่น รายการที่เชื่อมโยงเป็นเหมือน [5, 3, 2, 0, -4, 7] และ pos =1 ดังนั้นจึงมีวงจรและส่วนท้ายเชื่อมต่อกับโหนดที่สอง ข้อจำกัดคือเราไม่สามารถแก้ไขรายการได้

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ช้า :=หัวและเร็ว :=หัว
  • ในขณะที่ใช้งานได้ช้า เร็ว และถัดไปของเร็ว
    • ช้า :=ถัดจากช้า
    • เร็ว :=ถัดไปจาก (ถัดไปจากเร็ว)
    • ถ้าช้า =เร็วก็แตก
  • ถ้า fast ไม่ว่าง หรือ next of first ไม่ว่าง ให้คืนค่า null
  • ถ้าช้า =เร็ว แล้ว
    • ช้า :=หัว
    • ในขณะที่ช้าไม่เร็ว
      • ช้า :=ถัดจากช้าและเร็ว :=ถัดจากเร็ว
  • กลับช้า

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class ListNode{
   public:
      int val;
      ListNode *next;
      ListNode(int data){
         val = data;
         next = NULL;
      }
};
ListNode *make_list(vector<int> v){
   ListNode *head = new ListNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      ListNode *ptr = head;
      while(ptr->next != NULL){
         ptr = ptr->next;
      }
      ptr->next = new ListNode(v[i]);
   }
   return head;
}
ListNode *get_node(ListNode *head, int pos){
   ListNode *ptr = head;
   if(pos != -1){
      int p = 0;
      while(p < pos){
         ptr = ptr->next;
            p++;
      }
      return ptr;
   }
   return NULL;
}
class Solution {
   public:
   ListNode *detectCycle(ListNode *head) {
      ListNode* slow = head;
      ListNode* fast = head;
      while(slow && fast && fast->next){
         slow = slow->next;
         fast = fast->next->next;
         if(slow == fast)break;
      }
      if(!fast || !fast->next)return NULL;
      if(slow == fast){
         slow = head;
         while(slow!=fast){
            slow = slow->next;
            fast = fast->next;
         }
      }
      return slow;
   }
};
main(){
   Solution ob;
   vector<int> v = {5,3,2,0,-4,7};
   ListNode *head = make_list(v);
   int pos = 1;
   ListNode *lastNode = get_node(head, v.size() - 1);
   lastNode->next = get_node(head, pos);
   cout << "Tail is connected to the node with value:" <<ob.detectCycle(head)->val;
}

อินพุต

[5,3,2,0,-4,7]
1

ผลลัพธ์

Tail is connected to the node with value:3