ホームページ >バックエンド開発 >C++ >C++ を使用した指定サイズによる二重リンクリストのグループ化を逆にする

C++ を使用した指定サイズによる二重リンクリストのグループ化を逆にする

王林
王林転載
2023-09-04 09:49:061208ブラウズ

C++ を使用した指定サイズによる二重リンクリストのグループ化を逆にする

この問題では、リンクされたリストの先頭へのポインタと整数 k を取得します。サイズ k のグループでは、リンクされたリストを逆にする必要があります。例: -

Input : 1 <-> 2 <-> 3 <-> 4 <-> 5 (doubly linked list), k = 3
Output : 3 <-> 2 <-> 1 <-> 5 <-> 4

解決策を見つける方法

この問題では、この問題を解決するための再帰的アルゴリズムを定式化します。この方法では再帰を使用し、再帰を使用して問題を解決します。

#include <iostream>
using namespace std;
struct Node {
   int data;
   Node *next, *prev;
};
// push function to push a node into the list
Node* push(Node* head, int data) {
   Node* new_node = new Node();
   new_node->data = data;
   new_node->next = NULL;
   Node* TMP = head;
   if (head == NULL) {
      new_node->prev = NULL;
      head = new_node;
      return head;
   }
   while (TMP->next != NULL) { // going to the last node
      TMP = TMP->next;
   }
   TMP->next = new_node;
   new_node->prev = TMP;
   return head; // return pointer to head
}
// function to print given list
void printDLL(Node* head) {
   while (head != NULL) {
   cout << head->data << " ";
   head = head->next;
}
cout << endl;
}
Node* revK(Node* head, int k) {
   if (!head)
      return NULL;
   head->prev = NULL;
   Node *TMP, *CURRENT = head, *newHead;
   int count = 0;
   while (CURRENT != NULL && count < k) { // while our count is less than k we simply reverse                                                 the nodes.
      newHead = CURRENT;
      TMP = CURRENT->prev;
      CURRENT->prev = CURRENT->next;
      CURRENT->next = TMP;
      CURRENT = CURRENT->prev;
      count++;
   }
   if (count >= k) {
      head->next = revK(CURRENT, k); // now when if the count is greater or equal
      //to k we connect first head to next head
   }
   return newHead;
}
int main() {
   Node* head;
   for (int i = 1; i <= 5; i++) {
      head = push(head, i);
   }
   cout << "Original List : ";
   printDLL(head);
   cout << "\nModified List : ";
   int k = 3;
   head = revK(head, k);
   printDLL(head);
}

出力

Original List : 1 2 3 4 5
Modified List : 3 2 1 5 4

上記のコードの説明

このメソッドでは、リストをループし、カウントが以下になるまで繰り返します。 k. head -> next( ここでは、トラバース中にリストを逆にしているだけですが、k に到達したら、head が別のリストの k 番目の要素を指すようにする必要があります。たとえば、リストが 1 の場合、head に値を与える再帰呼び出しを行います。 2 3 4 5、k は 3 で、中央の要素を反転して 3 2 1 にしましたが、その要素も反転されるため、4 を指すには 1 が必要です。そのため、再帰呼び出しを使用して追加の if を作成します。ステートメント。)。

結論

この記事では、recursion を使用して問題を解決しました。また、この問題に対する C プログラムと、それを解決するための完全なアプローチも学びました。同じプログラムを C、Java、Python などの他の言語で書くことができます。この記事がお役に立てば幸いです。

以上がC++ を使用した指定サイズによる二重リンクリストのグループ化を逆にするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。