ภาพรวม
เมื่อได้รับ Singly Linked List เป็นอินพุต เป้าหมายคือแบ่งลิสต์ออกเป็นสอง Singly Linked List ที่มีโหนดสลับกันจากลิสต์เดิม ตัวอย่าง: ลิสต์ a → b → c → d → e → f จะแบ่งเป็น a → c → e และ b → d → f
ใช้สองพอยน์เตอร์ N1 และ N1 ชี้ที่หัวและหัว→next ตามลำดับ จากนั้นเลื่อนทั้งคู่ไปที่ next ของ next เพื่อสร้างสับลิสต์
ตัวอย่าง
อินพุต − ลิสต์: 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 ชี้ที่หัวและหัว→next ตามลำดับ เลื่อนทั้งคู่ไปที่ next ของ next แบบเรียกซ้ำเพื่อสร้างสองสับลิสต์
- โครงสร้าง
Nodeมีint dataและNode* next - ฟังก์ชัน
addtohead(Node** head, int data)เพิ่มโหนดที่หัว - สร้าง Singly Linked List
- ฟังก์ชัน
display(Node* head)พิมพ์ลิสต์ - สองพอยน์เตอร์
node1และnode2 - ฟังก์ชัน
splitList(Node* head, Node** n1, Node** n2)ตั้งn1ชี้หัว และn2ชี้หัว→next แล้วเรียกsplit - ฟังก์ชัน
split(Node* N1, Node* N2)สร้างสับลิสต์สลับกัน - ถ้า N1 และ N2 เป็น NULL คืนค่า
- ถ้า N1→next ไม่เป็น NULL ตั้ง
tmp = N1->next->nextและN1->next = tmp - ถ้า N2→next ไม่เป็น NULL ตั้ง
tmp = N2->next->nextและN2->next = tmp - เรียก
split(N1->next, N2->next)ต่อ - พิมพ์สับลิสต์ด้วย
display()
ตัวอย่างโค้ด C++
#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