กำหนดรายการเชื่อมโยงแบบเดี่ยวเป็นอินพุต เป้าหมายคือการแบ่งรายการออกเป็นสองรายการที่เชื่อมโยงโดยลำพังซึ่งมีโหนดสำรองของรายการดั้งเดิม หากรายการอินพุตมีโหนด a → b → c → d → e → f หลังจากแยกแล้ว รายการย่อยสองรายการจะเป็น a → c → e และ b → d → f
เราจะใช้ตัวชี้สองตัว N1 และ N2 ตัวหนึ่งชี้ไปที่ส่วนหัวของรายการดั้งเดิมและอีกตัวชี้ไปที่ส่วนหัว → ถัดไป ตอนนี้ย้ายพอยน์เตอร์ทั้งสองไปที่โหนดถัดไปและสร้างรายการย่อย
ตัวอย่าง
ป้อนข้อมูล − รายการ :- 1 → 5 → 7 → 12 → 2 → 96 → 33
ผลผลิต − รายการดั้งเดิม :1 5 7 12 2 96 33
รายการ 1:1 7 2 33
รายการ 2:5 12 96
คำอธิบาย − เริ่มจาก 1 และ 5 และจุดถัดไปไปยังโหนดสำรองเพื่อสร้างรายการย่อยที่แสดงด้านบน
ป้อนข้อมูล − รายการ :- 13 → 53 → 90 → 18 → 44 → 11 → 99 → 32
ผลผลิต − รายการดั้งเดิม :13 53 90 18 44 11 99 32
รายการ 1:13 90 44 99
รายการ 2:53 18 11 32
คำอธิบาย − เริ่มจาก 13 และ 53 และจุดถัดไปไปยังโหนดสำรองเพื่อสร้างรายการย่อยที่แสดงด้านบน
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในแนวทางนี้ เราจะใช้ตัวชี้ N1 และ N2 สองตัว ตัวหนึ่งชี้ไปที่ส่วนหัวของรายการดั้งเดิม และอีกตัวชี้ไปที่ส่วนหัว→ ถัดไป ตอนนี้ย้ายพอยน์เตอร์ทั้งสองไปที่โหนดถัดไปและสร้างรายการย่อย
-
ใช้โครงสร้างโหนดที่มีส่วนข้อมูล int และโหนดเป็นตัวชี้ถัดไป
-
ฟังก์ชัน addtohead(โหนด** head, int data) ใช้เพื่อเพิ่มโหนดในส่วนหัวเพื่อสร้างรายการที่เชื่อมโยงโดยลำพัง
-
สร้างรายการที่เชื่อมโยงโดยลำพังโดยใช้ฟังก์ชันข้างต้นโดยมีส่วนหัวเป็นตัวชี้ไปยังโหนดแรก
-
การแสดงฟังก์ชัน (หัวโหนด*) ใช้เพื่อพิมพ์รายการที่เชื่อมโยงโดยเริ่มจากโหนดหลัก
-
ใช้ตัวชี้โหนดสองตัว node1 และ node2
-
ฟังก์ชัน splitList(หัวโหนด*, โหนด** n1, โหนด** n2) นำพอยน์เตอร์ของโหนดและชี้ n1 ไปที่ส่วนหัว และ n2 ไปยังส่วนหัว → ถัดจากสตริงเดิม
-
ข้างในนั้นเรียก split(*n1, *n2) เพื่อแยกรายการดั้งเดิมออกเป็นสองรายการย่อย
-
การแยกฟังก์ชัน (โหนด* N1, โหนด* N2) รับตัวชี้ N1 และ N2 และสร้างรายการย่อยสองรายการที่มีโหนดสลับกันของรายการดั้งเดิม
-
หากทั้ง N1 และ N2 เป็นโมฆะ ก็จะไม่ส่งคืนสิ่งใด
-
ถ้า N1→ next ไม่เป็นค่าว่าง ให้ตั้งค่า tmp=N1->next->next และ N1->next =tmp;
-
f N2→ next ไม่เป็นค่าว่าง จากนั้นให้ตั้งค่า tmp=N2->next->next และ N2->next =tmp;
-
การแยกการโทร (N1->ถัดไป, N2->ถัดไป); สำหรับการทำซ้ำครั้งต่อไป
-
ในตอนท้ายพิมพ์รายการย่อยโดยใช้ display()
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
};
void addtohead(Node** head, int data){
Node* nodex = new Node;
nodex->data = data;
nodex->next = (*head);
(*head) = nodex;
}
void split(Node* N1, Node* N2){
Node *tmp;
if (N1 == NULL || N2 == NULL){
return;
}
if (N1->next != NULL){
tmp=N1->next->next;
N1->next = tmp;
}
if (N2->next != NULL){
tmp=N2->next->next;
N2->next = tmp;
}
split(N1->next, N2->next);
}
void splitList(Node* head, Node** n1, Node** n2){
*n1 = head;
*n2 = head->next;
split(*n1, *n2);
}
void display(Node* head){
Node* curr = head;
if (curr != NULL){
cout<<curr->data<<" ";
display(curr->next);
}
}
int main(){
Node* head = NULL;
Node *node1 = NULL, *node2 = NULL;
addtohead(&head, 20);
addtohead(&head, 12);
addtohead(&head, 15);
addtohead(&head, 8);
addtohead(&head, 10);
addtohead(&head, 4);
addtohead(&head, 5);
cout<<"Original List :"<<endl;
display(head);
splitList(head, &node1, &node2);
cout<<endl<<"List 1: ";
display(node1);
cout<<endl<<"List 2: ";
display(node2);
return 0;
} ผลลัพธ์
หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้
Original List : 5 4 10 8 15 12 20 List 1: 5 10 15 20 List 2: 4 8 12