この問題では、リンクされたリストの先頭へのポインタと整数 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 サイトの他の関連記事を参照してください。