Rumah > pembangunan bahagian belakang > C++ > Balikkan kumpulan senarai pautan berganda mengikut saiz yang diberikan menggunakan C++

Balikkan kumpulan senarai pautan berganda mengikut saiz yang diberikan menggunakan C++

王林
Lepaskan: 2023-09-04 09:49:06
ke hadapan
1235 orang telah melayarinya

Balikkan kumpulan senarai pautan berganda mengikut saiz yang diberikan menggunakan C++

Dalam masalah ini, kita mendapat penunjuk ke kepala senarai terpaut dan integer k. Dalam kumpulan saiz k, kita perlu membalikkan senarai terpaut. Contohnya -

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

Kaedah untuk mencari penyelesaian

Dalam masalah ini kita akan merumuskan algoritma rekursif untuk menyelesaikan masalah ini. Dalam kaedah ini kita akan menggunakan rekursi dan menyelesaikan masalah menggunakan rekursi.

Contoh

#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);
}

Salin selepas log masuk

Output

Original List : 1 2 3 4 5
Modified List : 3 2 1 5 4
Salin selepas log masuk

Penjelasan kod di atas

Dalam kaedah ini, kita melingkari senarai dan mengulang sehingga kiraan kurang daripada k. Kami membuat panggilan rekursif memberikan nilai ke kepala -> seterusnya ( Di sini kami hanya membalikkan senarai semasa melintasi, tetapi apabila k dicapai, kami perlu membuat titik kepala ke elemen kth senarai lain, contohnya jika senarai kami ialah 1 2 3 4 5, k kita ialah 3, kita terbalikkan elemen tengah menjadi 3 2 1, tetapi sekarang kita perlu 1 untuk menunjuk ke 4 kerana elemen itu juga akan diterbalikkan, jadi itulah sebabnya kita menggunakan panggilan rekursif dan membuat tambahan jika kenyataan).

Kesimpulan

Dalam artikel ini, kami menyelesaikan menggunakan Rekursi. Kami juga mempelajari program C++ untuk masalah ini dan pendekatan lengkap kami untuk menyelesaikannya. Kita boleh menulis program yang sama dalam bahasa lain seperti C, java, python dan bahasa lain. Kami berharap artikel ini dapat membantu anda.

Atas ialah kandungan terperinci Balikkan kumpulan senarai pautan berganda mengikut saiz yang diberikan menggunakan C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan