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

ลบโหนดกลาง Doubly Linked List ใน Python

บทนำ

การลบโหนดที่ตำแหน่งกลาง (middle) ของ Doubly Linked List ต้องหาตำแหน่งกลางจาก size แล้วปรับ pointer ของโหนดก่อนและหลังให้ข้ามโหนดที่ลบ

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

class Node:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0

    def append(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = self.tail = new_node
        else:
            self.tail.next = new_node
            new_node.prev = self.tail
            self.tail = new_node
        self.size += 1

    def display(self):
        curr = self.head
        while curr:
            print(curr.data, end=' ')
            curr = curr.next
        print()

    def delete_middle(self):
        if self.head is None:
            return
        
        # หาตำแหน่งกลาง (1-based)
        mid = (self.size // 2) if self.size % 2 == 0 else ((self.size + 1) // 2)
        
        curr = self.head
        for _ in range(mid - 1):
            curr = curr.next
        
        # ลบ curr
        if curr == self.head:
            self.head = curr.next
            if self.head:
                self.head.prev = None
            else:
                self.tail = None
        elif curr == self.tail:
            self.tail = curr.prev
            self.tail.next = None
        else:
            curr.prev.next = curr.next
            curr.next.prev = curr.prev
        
        self.size -= 1

# ทดสอบ: ลบกลางซ้ำจนหมด
dll = DoublyLinkedList()
for v in [10, 24, 54, 77, 92]:
    dll.append(v)

print("เริ่มต้น:", end=' ')
dll.display()

while dll.head:
    dll.delete_middle()
    print("หลังลบกลาง:", end=' ')
    dll.display()

ผลลัพธ์

เริ่มต้น: 10 24 54 77 92
หลังลบกลาง: 24 54 77 92
หลังลบกลาง: 54 77 92
หลังลบกลาง: 77 92
หลังลบกลาง: 92
หลังลบกลาง: (ว่าง)

คำอธิบาย

  • คำนวณ mid: size=5→3, size=4→2, size=3→2, size=2→1, size=1→1
  • เดินหาโหนด curr ตำแหน่ง mid
  • 3 กรณีลบ: head, tail, middle
  • ปรับ pointer ให้ข้าม curr, อัปเดต head/tail/size