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

C++ में सिंगल लिंक्ड लिस्ट में रिवर्स अल्टरनेटिव K नोड्स

इस ट्यूटोरियल में, हमें लंबाई N की एक लिंक्ड लिस्ट A और एक पूर्णांक K दिया गया है। हमें प्रत्येक जोड़ी के आकार के साथ K के रूप में नोड्स के वैकल्पिक जोड़े को उलटना होगा। यह भी दिया गया है कि N, K से विभाज्य है। पहला तर्क है लिंक की गई सूची A का हेड पॉइंटर और दूसरा तर्क एक पूर्णांक K है, उदाहरण के लिए

इनपुट

5 -> 6 -> 2 -> 8 -> 5 -> 2 -> 4 -> 8 -> 9 -> 6 -> null K=2

आउटपुट

6 -> 5 -> 2 -> 8 -> 2 -> 5 -> 4 -> 8 -> 6 -> 9 -> null
1 -> 2 -> 5 -> 8 -> 9 -> 6 -> 4 -> 5 -> 8 -> null K=3

आउटपुट

5 -> 2 -> 1 -> 8 -> 9 -> 6 -> 8 -> 5 -> 4 -> null

समाधान खोजने के लिए दृष्टिकोण

पुनरावर्ती समाधान

  • प्रति पुनरावृत्ति (या लूप) 2K नोड्स को ट्रैवर्स करें और दिए गए इनपुट (लिंक्ड सूची) में जॉइन और टेल पॉइंटर का उपयोग करके K नोड्स के प्रत्येक जोड़े के सिर और पूंछ को रिकॉर्ड करें।

  • फिर, लिंक की गई सूची के k नोड्स को उल्टा करें और उलटी सूची के टेल नोड में शामिल हों, प्रारंभिक लिंक्ड सूची के हेड नोड के साथ, जॉइन पॉइंटर द्वारा इंगित करें।

  • फिर हम वर्तमान पॉइंटर को अगले k नोड्स में बदल देंगे।

  • सामान्य सूची की पूंछ अब अंतिम नोड के रूप में कार्य करती है (जो नई पूंछ द्वारा इंगित की जाती है), और जुड़ने वाला सूचक नई (उलट) सूची के शीर्ष पर इंगित करेगा, और वे विलय हो जाएंगे। हम इन चरणों को तब तक दोहराएंगे जब तक कि सभी नोड समान चरणों का पालन न करें।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Node {
   public:
   int data;
   Node* next;
};
Node* kAltReverse(struct Node* head, int k){
   Node* prev = NULL;
   Node* curr = head;
   Node* temp = NULL;
   Node* tail = NULL;
   Node* newHead = NULL;
   Node* join = NULL;
   int t = 0;
   while (curr) {
      t = k;
      join = curr;
      prev = NULL;
      while (curr && t--) {
         temp = curr->next;
         curr->next = prev;
         prev = curr;
         curr = temp;
      }
      if (!newHead)
         newHead = prev;
      if (tail)
         tail->next = prev;
      tail = join;
      tail->next = curr;
      t = k;
      while (curr && t--) {
         prev = curr;
         curr = curr->next;
      }
      tail = prev;
   }
   return newHead;
}
void push(Node** head_ref, int new_data){
   Node* new_node = new Node();
   new_node->data = new_data;
   new_node->next = (*head_ref);
   (*head_ref) = new_node;
}
void printList(Node* node){
   int count = 0;
   while (node != NULL) {
      cout << node->data << " ";
      node = node->next;
      count++;
   }
}
int main(void){
   Node* head = NULL;
   int i;
   for (i = 6; i <27; i+=3)
      push(&head, i);
   int k = 3;
   cout << "Given linked list \n";
   printList(head);
   head = kAltReverse(head, k);
   cout << "\n Modified Linked list \n";
   printList(head);
   return (0);
}

आउटपुट

Given linked list
24 21 18 15 12 9 6
Modified Linked list
18 21 24 15 12 9 6

पुनरावर्ती समाधान

  • प्रारंभ से K नोड्स को ट्रैवर्स करें और अस्थायी मान को k+1वें नोड पर सेट करें

  • ट्रैवर्स किए गए सभी K नोड्स को उलट दें।

  • K नोड्स की उस जोड़ी के अंतिम नोड के अगले पॉइंटर को अस्थायी पर सेट करें।

  • अगले पुनरावृत्ति को छोड़ दें जिसमें उन K नोड्स की जोड़ी को छोड़ना होगा।

  • अंतिम नोड तक पहुंचने तक अगले k नोड्स को उलटने के लिए इन सभी चरणों का पुनरावर्ती रूप से पालन करें।

छद्म कोड

reverseAltK(head, k)
   curr = head
   prev = null
   next = null
   count = 0
   WHILE count < k AND curr
      next = curr.next
      curr.next = prev
      prev = curr
      curr = next
      count = count + 1
IF head
   head.next = curr
count = 0
WHILE count < k-1 AND curr
   curr = curr.next
   count = count + 1
IF curr
   curr.next = reverseKGroupAltRecursive(curr.next, k)
return prev

उदाहरण

#include <bits/stdc++.h>
using namespace std;
/* Link list node */
class node{
   public:
   int data;
   node* next;
};
/* Helper function for kAltReverse() */
node * _kAltReverse(node *node, int k, bool b);

/* Alternatively reverses the given linked list
in groups of given size k. */
node *kAltReverse(node *head, int k){
   return _kAltReverse(head, k, true);
}
/* Helper function for kAltReverse().
It reverses k nodes of the list only if
the third parameter b is passed as true,
otherwise moves the pointer k nodes ahead
and recursively calls iteself */
node * _kAltReverse(node *Node, int k, bool b){
   if(Node == NULL)
      return NULL;
   int count = 1;
   node *prev = NULL;
   node *current = Node;
   node *next;
   /* The loop serves two purposes
      1) If b is true,
      then it reverses the k nodes
      2) If b is false,
      then it moves the current pointer */
   while(current != NULL && count <= k){
      next = current->next;
      /* Reverse the nodes only if b is true*/
         if(b == true)
            current->next = prev;
      prev = current;
      current = next;
      count++;
   }
   /* 3) If b is true, then node is the kth node.
   So attach rest of the list after node.
   4) After attaching, return the new head */
   if(b == true){
      Node->next = _kAltReverse(current, k, !b);
      return prev;
   }
   /* If b is not true, then attach
   rest of the list after prev.
   So attach rest of the list after prev */
   else{
      prev->next = _kAltReverse(current, k, !b);
      return Node;
   }
}
/* UTILITY FUNCTIONS */
/* Function to push a node */
void push(node** head_ref, int new_data){
   /* allocate node */
   node* new_node = new node();
   /* put in the data */
   new_node->data = new_data;
   /* link the old list off the new node */
   new_node->next = (*head_ref);
   /* move the head to point to the new node */
   (*head_ref) = new_node;
}
/* Function to print linked list */
void printList(node *node){
   int count = 0;
   while(node != NULL){
      cout << node->data << " ";
      node = node->next;
      count++;
   }
}
// Driver Code
int main(void){
   /* Start with the empty list */
   node* head = NULL;
   int i;
   // create a list 1->2->3->4->5...... ->20
   for(i = 20; i > 0; i--)
      push(&head, i);
   cout << "Given linked list \n";
   printList(head);
   head = kAltReverse(head, 3);
   cout << "\nModified Linked list \n";
   printList(head);
   return(0);
}

आउटपुट

Given linked list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Modified Linked list
3 2 1 4 5 6 9 8 7 10 11 12 15 14 13 16 17 18 20 19

निष्कर्ष

इस ट्यूटोरियल ने हमें सिखाया कि कैसे एक सिंगल लिंक्ड लिस्ट में वैकल्पिक k नोड्स को रिवर्स किया जाए और c++ कोड में स्यूडो-कोड इम्प्लीमेंटेशन किया जाए। हम इस कोड को जावा, पायथन और अन्य भाषाओं में भी लिख सकते हैं। इस दृष्टिकोण में, हमने वैकल्पिक K नोड्स को उलटने और शेष नोड्स को छोड़ने के लिए रिकर्सन का उपयोग किया। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगा होगा।


  1. सी++ में लिंक्ड सूची के वैकल्पिक नोड्स का योग

    इस समस्या में हमें एक लिंक्ड लिस्ट दी जाती है। हमारा काम लिंक की गई सूची के वैकल्पिक नोड्स के योग को प्रिंट करना है। लिंक्ड सूची डेटा संरचना का एक क्रम है जो लिंक के माध्यम से एक साथ जुड़े होते हैं। अब, समस्या पर वापस आते हैं। यहां, हम लिंक की गई सूची के वैकल्पिक नोड्स जोड़ेंगे। इसका मतलब है कि ह

  1. C++ में सर्कुलर लिंक्ड लिस्ट में नोड्स गिनें

    हमें नोड्स के साथ एक सर्कुलर लिंक्ड लिस्ट दी गई है और कार्य एक सर्कुलर लिंक्ड लिस्ट में मौजूद नोड्स की गिनती की गणना करना है। सर्कुलर लिंक्ड लिस्ट लिंक्ड लिस्ट का एक रूपांतर है जिसमें पहला तत्व अंतिम तत्व को इंगित करता है और अंतिम तत्व पहले तत्व को इंगित करता है। सिंगल लिंक्ड लिस्ट और डबल लिंक्ड लि

  1. सी ++ में रिकर्सन का उपयोग करके लिंक की गई सूची के वैकल्पिक नोड्स प्रिंट करें

    एक लिंक्ड सूची एक रैखिक डेटा संरचना है जो तत्व को गैर-सन्निहित स्मृति स्थानों में संग्रहीत करती है। प्रत्येक तत्व में लिंक की गई सूची के अगले तत्व के लिए एक सूचक होता है। उदाहरण - इस समस्या में, हमें एक लिंक्ड सूची दी जाती है और हमें इस लिंक्ड सूची के तत्वों को मुद्रित करने की आवश्यकता होती है ल