Published
- 3 min read
Single Link-List
ADT Single Link-List
Code
class Node:
def __init__(self, data):
self.data = data # ข้อมูลในโหนด
self.next = None # อ้างอิงไปยังโหนดถัดไป
class SLinkList:
def __init__(self):
self.head = None # อ้างอิงไปยังโหนดแรก
self.tail = None # อ้างอิงไปยังโหนดสุดท้าย
self.size = 0 # จำนวนโหนดในลิงค์ลิสต์
def __len__(self):
return self.size # ส่งค่ากลับจำนวนโหนด
def add_first(self, item):
new_node = Node(item) # สร้างโหนดใหม่
if self.head is None: # ถ้าลิงค์ลิสต์ว่างเปล่า
self.head = self.tail = new_node
else:
new_node.next = self.head # เชื่อมโหนดใหม่ไปยังโหนดแรก
self.head = new_node # อัพเดท head เป็นโหนดใหม่
self.size += 1 # เพิ่มขนาดลิงค์ลิสต์
def add_last(self, item):
new_node = Node(item) # สร้างโหนดใหม่
if self.tail is None: # ถ้าลิงค์ลิสต์ว่างเปล่า
self.head = self.tail = new_node
else:
self.tail.next = new_node # เชื่อมโหนดสุดท้ายไปยังโหนดใหม่
self.tail = new_node # อัพเดท tail เป็นโหนดใหม่
self.size += 1 # เพิ่มขนาดลิงค์ลิสต์
def remove_first(self):
if self.head is None: # ถ้าลิงค์ลิสต์ว่างเปล่า
raise IndexError("ลิงค์ลิสต์ว่างเปล่า")
data = self.head.data # เก็บข้อมูลของโหนดแรก
self.head = self.head.next # อัพเดท head เป็นโหนดถัดไป
if self.head is None: # ถ้าไม่มีโหนดเหลือ
self.tail = None
self.size -= 1 # ลดขนาดลิงค์ลิสต์
return data # ส่งค่าข้อมูลของโหนดที่ลบ
def remove_last(self):
if self.tail is None: # ถ้าลิงค์ลิสต์ว่างเปล่า
raise IndexError("ลิงค์ลิสต์ว่างเปล่า")
data = self.tail.data # เก็บข้อมูลของโหนดสุดท้าย
if self.head == self.tail: # ถ้ามีโหนดเดียว
self.head = self.tail = None
else:
current = self.head
while current.next != self.tail: # หาโหนดก่อนโหนดสุดท้าย
current = current.next
current.next = None # ตัดการเชื่อมโหนดสุดท้าย
self.tail = current # อัพเดท tail เป็นโหนดก่อนสุดท้าย
self.size -= 1 # ลดขนาดลิงค์ลิสต์
return data # ส่งค่าข้อมูลของโหนดที่ลบ
def remove_node(self, item):
if self.head is None: # ถ้าลิงค์ลิสต์ว่างเปล่า
raise ValueError("ลิงค์ลิสต์ว่างเปล่า")
if self.head.data == item: # ถ้าโหนดแรกมีข้อมูลเท่ากับ item
return self.remove_first()
current = self.head
while current.next is not None and current.next.data != item: # หาโหนดก่อนโหนดที่ต้องการลบ
current = current.next
if current.next is None: # ถ้าไม่พบโหนดที่มีข้อมูลเท่ากับ item
raise ValueError(f"ไม่พบโหนดที่มีข้อมูล {item}")
data = current.next.data # เก็บข้อมูลของโหนดที่ต้องการลบ
current.next = current.next.next # ตัดการเชื่อมโหนดที่ต้องการลบ
if current.next is None: # ถ้าโหนดที่ลบเป็นโหนดสุดท้าย
self.tail = current
self.size -= 1 # ลดขนาดลิงค์ลิสต์
return data # ส่งค่าข้อมูลของโหนดที่ลบ
def __repr__(self):
nodes = []
current = self.head
while current is not None: # วนลูปเพื่อเก็บข้อมูลทุกโหนด
nodes.append(str(current.data))
current = current.next
return " -> ".join(nodes) # ส่งค่ากลับเป็นสตริง
def __iter__(self):
current = self.head
while current is not None: # วนลูปเพื่อส่งค่าข้อมูลทุกโหนด
yield current.data
current = current.next
def __contains__(self, item):
current = self.head
while current is not None: # วนลูปเพื่อค้นหาข้อมูล
if current.data == item:
return True
current = current.next
return False # ถ้าไม่พบข้อมูล
การทำงาน
ผลแสดงการทำงานของแต่ละเมธอด
ตัวอย่างข้อมูล:
sll = SLinkList()
add_first
- เพิ่มโหนดที่ด้านหน้า (
add_first):
sll.add_first(10)
sll.add_first(20)
sll.add_first(30)
print(sll) # ผลลัพธ์: 30 -> 20 -> 10
add_last
- เพิ่มโหนดที่ด้านท้าย (
add_last):
sll.add_last(40)
sll.add_last(50)
print(sll) # ผลลัพธ์: 30 -> 20 -> 10 -> 40 -> 50
remove_first
- ลบโหนดแรก (
remove_first):
removed_data = sll.remove_first()
print(f"ลบโหนดแรก: {removed_data}") # ผลลัพธ์: ลบโหนดแรก: 30
print(sll) # ผลลัพธ์: 20 -> 10 -> 40 -> 50
remove_last
- ลบโหนดสุดท้าย (
remove_last):
removed_data = sll.remove_last()
print(f"ลบโหนดสุดท้าย: {removed_data}") # ผลลัพธ์: ลบโหนดสุดท้าย: 50
print(sll) # ผลลัพธ์: 20 -> 10 -> 40
remove_node
- ลบโหนดที่มีข้อมูลเฉพาะ (
remove_node):
removed_data = sll.remove_node(10)
print(f"ลบโหนดที่มีข้อมูล 10: {removed_data}") # ผลลัพธ์: ลบโหนดที่มีข้อมูล 10: 10
print(sll) # ผลลัพธ์: 20 -> 40
__contains__
- ตรวจสอบว่ามีข้อมูลในลิงค์ลิสต์หรือไม่ (
__contains__):
print(20 in sll) # ผลลัพธ์: True
print(100 in sll) # ผลลัพธ์: False
__repr__
- แสดงข้อมูลทั้งหมดในลิงค์ลิสต์ (
__repr__):
print(sll) # ผลลัพธ์: 20 -> 40
__iter__
- วนลูปเพื่อเข้าถึงข้อมูลทุกโหนด (
__iter__):
for data in sll:
print(data, end=" ") # ผลลัพธ์: 20 40
สรุป
- โค้ดนี้เป็นตัวอย่างการใช้งาน Single Link-List ใน Python
- แต่ละเมธอดทำงานตามที่อธิบายไว้ในโจทย์
- สามารถทดสอบการทำงานด้วยข้อมูลอื่นๆ ได้ตามต้องการ