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 insert_at_middle(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = self.tail = new_node
        else:
            # หาตำแหน่งกลาง
            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 คือโหนดก่อนตำแหน่งกลาง
            new_node.next = curr.next
            new_node.prev = curr
            if curr.next:
                curr.next.prev = new_node
            else:
                self.tail = new_node
            curr.next = new_node
        self.size += 1

# ทดสอบ
dll = DoublyLinkedList()
for v in [10, 24, 54]:
    dll.append(v)

print("ลิสต์เดิม:", end=' ')
dll.display()

dll.insert_at_middle(77)
print("หลังแทรก 77 กลาง:", end=' ')
dll.display()

dll.insert_at_middle(92)
print("หลังแทรก 92 กลาง:", end=' ')
dll.display()

ผลลัพธ์

ลิสต์เดิม: 10 24 54
หลังแทรก 77 กลาง: 10 24 77 54
หลังแทรก 92 กลาง: 10 24 92 77 54

คำอธิบาย

  • mid = size//2 (คู่) หรือ (size+1)//2 (คี่) → ตำแหน่ง 1-based
  • เดิน mid-1 ก้าว เพื่อหาโหนดก่อนจุดแทรก
  • ปรับ pointer 4 จุด: new_node.next, new_node.prev, curr.next.prev, curr.next
  • จัดการกรณีแทรกท้าย (curr.next is None) → อัปเดต tail

Insert at Position (ทั่วไป)

def insert_at(self, pos, data):
    """แทรกที่ตำแหน่ง pos (1-based)"""
    if pos <= 1:
        self.prepend(data)
    elif pos >= self.size + 1:
        self.append(data)
    else:
        # logic เหมือน insert_at_middle