รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลเชิงเส้นซึ่งแต่ละโหนดมีสองบล็อก โดยที่หนึ่งบล็อกมีค่าหรือข้อมูลของโหนด และอีกบล็อกหนึ่งมีที่อยู่ของฟิลด์ถัดไป
สมมติว่าเรามีรายการที่เชื่อมโยงซึ่งแต่ละโหนดมีข้อมูลและตัวชี้ซึ่งชี้ไปยังโหนดถัดไปของรายการที่เชื่อมโยง งานคือการแยกรายการเชื่อมโยงที่กำหนด การแยกรายการที่เชื่อมโยงหมายความว่าเราต้องแยกโหนดที่มีดัชนีคี่และโหนดดัชนีในรายการ
แนวทางในการแก้ปัญหานี้
ในการแยกรายการเชื่อมโยงที่กำหนด เราจะแนะนำตัวชี้สามตัวสำหรับดัชนีคี่ ดัชนีคู่ และค่าที่ดัชนีคู่ ตามลำดับ หลังจากนั้น เราจะวนซ้ำบนรายการที่เชื่อมโยงทั้งหมดและเริ่มต้นตัวชี้ด้วยค่าบางอย่าง
ในรายการที่เชื่อมโยง การสร้างดัชนีเริ่มต้นจาก '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->.