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

ลบโหนดจาก Linked List โดยไม่มีตัวชี้หัว (Head Pointer) ใน C++


บทนำ

ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีการลบโหนดใน Singly Linked List โดยไม่มีตัวชี้หัว (head pointer) ซึ่งเป็นเทคนิคพิเศษที่ใช้เมื่อเรามีเพียงตัวชี้ไปยังโหนดที่ต้องการลบเท่านั้น

ขั้นตอนการแก้ปัญหา

  1. สร้างโครงสร้าง (struct) Node ที่มีข้อมูล (data) และตัวชี้ถัดไป (next)
  2. เขียนฟังก์ชันสำหรับแทรกโหนดใหม่เข้าไปใน Singly Linked List
  3. สร้าง Singly Linked List ตัวอย่างพร้อมข้อมูลทดสอบ
  4. ระบุโหนดที่ต้องการลบโดยใช้ตัวชี้ next
  5. ย้ายข้อมูลจากโหนดถัดไปมาทับโหนดที่ต้องการลบ แล้วลบโหนดถัดไปแทน

ข้อจำกัดสำคัญ

ไม่สามารถลบโหนดท้ายสุดได้** เพราะไม่มีโหนดถัดไปให้คัดลอกข้อมูลมา

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

struct Node {
    int data;
    struct Node* next;
};

void deleteNodeWithoutHead(struct Node* deletingNode) {
    if (deletingNode == NULL) return;
    
    if (deletingNode->next == NULL) {
        cout << "Can't delete last node without head" << endl;
        return;
    }
    
    struct Node* temp = deletingNode->next;
    deletingNode->data = temp->data;
    deletingNode->next = temp->next;
    free(temp);
}

void printLinkedList(Node* head) {
    Node* temp = head;
    while (temp) {
        cout << temp->data << " -> ";
        temp = temp->next;
    }
}

void insertNode(struct Node** head_ref, int new_data) {
    struct Node* new_node = new Node();
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

int main() {
    struct Node* head = NULL;
    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 3);
    insertNode(&head, 4);
    insertNode(&head, 5);
    insertNode(&head, 6);
    
    cout << "Linked List before deletion:" << endl;
    printLinkedList(head);
    
    Node* del = head->next;  // ลบโหนดที่ 2 (ค่า 5)
    deleteNodeWithoutHead(del);
    
    cout << "\nLinked List after deletion:" << endl;
    printLinkedList(head);
    return 0;
}

ผลลัพธ์

Linked List before deletion: 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 
Linked List after deletion: 6 -> 4 -> 3 -> 2 -> 1 ->

สรุป

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