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

วิธีแยกรายการเชื่อมโยงที่กำหนดใน C ++


รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลเชิงเส้นซึ่งแต่ละโหนดมีสองบล็อก โดยที่หนึ่งบล็อกมีค่าหรือข้อมูลของโหนด และอีกบล็อกหนึ่งมีที่อยู่ของฟิลด์ถัดไป

สมมติว่าเรามีรายการที่เชื่อมโยงซึ่งแต่ละโหนดมีข้อมูลและตัวชี้ซึ่งชี้ไปยังโหนดถัดไปของรายการที่เชื่อมโยง งานคือการแยกรายการเชื่อมโยงที่กำหนด การแยกรายการที่เชื่อมโยงหมายความว่าเราต้องแยกโหนดที่มีดัชนีคี่และโหนดดัชนีในรายการ

แนวทางในการแก้ปัญหานี้

ในการแยกรายการเชื่อมโยงที่กำหนด เราจะแนะนำตัวชี้สามตัวสำหรับดัชนีคี่ ดัชนีคู่ และค่าที่ดัชนีคู่ ตามลำดับ หลังจากนั้น เราจะวนซ้ำบนรายการที่เชื่อมโยงทั้งหมดและเริ่มต้นตัวชี้ด้วยค่าบางอย่าง

ในรายการที่เชื่อมโยง การสร้างดัชนีเริ่มต้นจาก '1' ดังนั้นสำหรับสตริงใด ๆ โหนดแรกของรายการจะถือว่าเป็นโหนดที่จัดทำดัชนีคี่เสมอ อย่างไรก็ตาม โหนดถัดไปจะถือเป็นโหนดที่จัดทำดัชนีแบบคู่

  • นำรายการที่เชื่อมโยงพร้อมข้อมูลและตัวชี้ไปยังโหนดถัดไป
  • ฟังก์ชัน segregateList(listnode *head) นำพอยน์เตอร์ไปที่ head node และส่งคืนรายการที่เชื่อมโยงที่แยกออกเป็นเอาต์พุต
  • เริ่มต้นตัวชี้สามตัว oddIndex, evenIndex และ evenHead ซึ่งกำลังชี้ไปที่ส่วนหัวของรายการ
  • วนซ้ำในรายการที่เชื่อมโยงทั้งหมดและเริ่มต้นตัวชี้ถัดไปของ oddIndex ด้วยตัวชี้ถัดไปของevenIndex
  • ตอนนี้ วนซ้ำทั่วทั้งรายการและเริ่มต้นตัวชี้ถัดไปของevenIndexด้วยตัวชี้ถัดไปของ oddIndex
  • ส่งคืนตัวชี้ส่วนหัว

ตัวอย่าง

#include <iostream>
using namespace std;
class node {
   public:
      int data;
   node * next;
   node(int d) {
      data = d;
      next = NULL;
   }
};
node * segregateList(node * head) {
   if (head == NULL) {
      return NULL;
   }
   node * oddIndex = head;
   node * evenIndex = head -> next;
   node * evenHead = evenIndex;
   while (evenIndex != NULL and evenIndex -> next != NULL) {
      oddIndex -> next = evenIndex -> next;
      oddIndex = oddIndex -> next;
      evenIndex -> next = oddIndex -> next;
      evenIndex = evenIndex -> next;
   }
   oddIndex -> next = evenHead;
   return head;
}
void insertAtNode(node * & head, int data) {
   node * n = new node(data);
   n -> next = head;
   head = n;
}
void print(node * head) {
   while (head != NULL) {
      cout << head -> data << "->";
      head = head -> next;
   }
}
int main() {
   node * head = NULL;
   // It could be possible that the head node contains NULL Value.
   insertAtNode(head, 5);
   insertAtNode(head, 8);
   insertAtNode(head, 3);
   insertAtNode(head, 1);
   insertAtNode(head, 2);
   print(head);
   cout << endl;
   segregateList(head);
   print(head);
}

การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น

ผลลัพธ์

2->3->5->1->8->

รายการเชื่อมโยงที่กำหนดคือ 2->1->3->8->5-> หลังจากแยกรายการที่เชื่อมโยงแล้ว มันจะสร้างผลลัพธ์เป็น 2->3->5->1->8->.