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

สร้าง Doubly Linked List แล้วแสดงย้อนกลับใน Python

บทนำ

Doubly Linked List สามารถแสดงผลย้อนกลับได้ง่ายเพราะมี tail pointer และ prev pointer ตัวอย่างนี้แสดงการสร้างลิสต์ แล้ว reverse pointers เพื่อแสดงย้อนหลัง

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

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

    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

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

    def display_backward(self):
        curr = self.tail
        while curr:
            print(curr.data, end=' ')
            curr = curr.prev
        print()

    def reverse_list(self):
        """กลับทิศทางลิสต์จริง (in-place reversal)"""
        curr = self.head
        while curr:
            # สลับ prev และ next
            curr.prev, curr.next = curr.next, curr.prev
            curr = curr.prev  # เดินต่อที่ next เดิม (ตอนนี้เป็น prev)
        
        # สลับ head และ tail
        self.head, self.tail = self.tail, self.head

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

print("ปกติ (head → tail):", end=' ')
dll.display_forward()

print("ย้อนหลัง (tail → head):", end=' ')
dll.display_backward()

print("\n--- กลับลิสต์จริง ---")
dll.reverse_list()
print("หลัง reverse (head → tail):", end=' ')
dll.display_forward()
print("ย้อนหลัง (tail → head):", end=' ')
dll.display_backward()

ผลลัพธ์

ปกติ (head → tail): 10 14 24 17 22
ย้อนหลัง (tail → head): 22 17 24 14 10

--- กลับลิสต์จริง ---
หลัง reverse (head → tail): 22 17 24 14 10
ย้อนหลัง (tail → head): 10 14 24 17 22

คำอธิบาย

  • display_backward() เริ่มจาก tail เดินผ่าน prev
  • reverse_list() สลับ prev/next ของทุกโหนด แล้วสลับ head/tail
  • In-place reversal: ไม่สร้างโหนดใหม่ แค่ปรับ pointer

วิธีอื่น: สร้างลิสต์ใหม่ (Non-destructive)

def reversed_copy(self):
    new_dll = DoublyLinkedList()
    curr = self.tail
    while curr:
        new_dll.append(curr.data)
        curr = curr.prev
    return new_dll