Python - รายการที่เชื่อมโยง

รายการที่เชื่อมโยงคือลำดับขององค์ประกอบข้อมูลซึ่งเชื่อมต่อกันผ่านลิงก์ องค์ประกอบข้อมูลแต่ละองค์ประกอบมีการเชื่อมต่อกับองค์ประกอบข้อมูลอื่นในรูปแบบของตัวชี้ Python ไม่มีรายการที่เชื่อมโยงในไลบรารีมาตรฐาน เราใช้แนวคิดของรายการที่เชื่อมโยงโดยใช้แนวคิดของโหนดตามที่กล่าวไว้ในบทที่แล้ว เราได้เห็นแล้วว่าเราสร้างคลาสโหนดและวิธีการสำรวจองค์ประกอบของโหนดอย่างไร ในบทนี้เราจะศึกษาประเภทของรายการที่เชื่อมโยงซึ่งเรียกว่ารายการที่เชื่อมโยงแบบเดี่ยว ในโครงสร้างข้อมูลประเภทนี้มีเพียงหนึ่งลิงก์ระหว่างองค์ประกอบข้อมูลสององค์ประกอบใด ๆ เราสร้างรายการดังกล่าวและสร้างวิธีการเพิ่มเติมเพื่อแทรกอัปเดตและลบองค์ประกอบออกจากรายการ

การสร้างรายการที่เชื่อมโยง

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

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

list1 = SLinkedList()
list1.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
# Link first Node to second node
list1.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3

การข้ามผ่านรายการที่เชื่อมโยง

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

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

# Link first Node to second node
list.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3

list.listprint()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังต่อไปนี้:

Mon
Tue
Wed

การแทรกในรายการที่เชื่อมโยง

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

การแทรกที่จุดเริ่มต้นของรายการที่เชื่อมโยง

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

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# Print the linked list
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval
    def AtBegining(self,newdata):
        NewNode = Node(newdata)

# Update the new nodes next val to existing node
        NewNode.nextval = self.headval
        self.headval = NewNode

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

list.headval.nextval = e2
e2.nextval = e3

list.AtBegining("Sun")

list.listprint()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังต่อไปนี้:

Sun
Mon
Tue
Wed

การแทรกที่ส่วนท้ายของรายการที่เชื่อมโยง

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

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# Function to add newnode
    def AtEnd(self, newdata):
        NewNode = Node(newdata)
        if self.headval is None:
            self.headval = NewNode
            return
        laste = self.headval
        while(laste.nextval):
            laste = laste.nextval
        laste.nextval=NewNode

# Print the linked list
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval


list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

list.headval.nextval = e2
e2.nextval = e3

list.AtEnd("Thu")

list.listprint()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังต่อไปนี้:

Mon
Tue
Wed
Thu

การแทรกระหว่างโหนดข้อมูลสองโหนด

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

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# Function to add node
    def Inbetween(self,middle_node,newdata):
        if middle_node is None:
            print("The mentioned node is absent")
            return

        NewNode = Node(newdata)
        NewNode.nextval = middle_node.nextval
        middle_node.nextval = NewNode

# Print the linked list
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval


list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Thu")

list.headval.nextval = e2
e2.nextval = e3

list.Inbetween(list.headval.nextval,"Fri")

list.listprint()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังต่อไปนี้:

Mon
Tue
Fri
Thu

การลบรายการออกจากรายการที่ชอบ

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

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

class SLinkedList:
    def __init__(self):
        self.head = None

    def Atbegining(self, data_in):
        NewNode = Node(data_in)
        NewNode.next = self.head
        self.head = NewNode
		
# Function to remove node
    def RemoveNode(self, Removekey):

        HeadVal = self.head

        if (HeadVal is not None):
            if (HeadVal.data == Removekey):
                self.head = HeadVal.next
                HeadVal = None
                return

        while (HeadVal is not None):
            if HeadVal.data == Removekey:
                break
            prev = HeadVal
            HeadVal = HeadVal.next

        if (HeadVal == None):
            return

        prev.next = HeadVal.next

        HeadVal = None

    def LListprint(self):
        printval = self.head
        while (printval):
            print(printval.data),
            printval = printval.next


llist = SLinkedList()
llist.Atbegining("Mon")
llist.Atbegining("Tue")
llist.Atbegining("Wed")
llist.Atbegining("Thu")
llist.RemoveNode("Tue")
llist.LListprint()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังต่อไปนี้:

Thu
Wed
Mon