Учебники

Python — связанные списки

Связанный список — это последовательность элементов данных, которые связаны между собой ссылками. Каждый элемент данных содержит соединение с другим элементом данных в виде указателя. Python не имеет связанных списков в своей стандартной библиотеке. Мы реализуем концепцию связанных списков, используя концепцию узлов, как обсуждалось в предыдущей главе. Мы уже видели, как мы создаем класс узла и как пройти элементы узла. В этой главе мы собираемся изучить типы связанных списков, известных как односвязные списки. В этом типе структуры данных существует только одна связь между любыми двумя элементами данных. Мы создаем такой список и создаем дополнительные методы для вставки, обновления и удаления элементов из списка.

Создание связанного списка

Связанный список создается с использованием класса узла, который мы изучали в предыдущей главе. Мы создаем объект Node и создаем другой класс для использования этого объекта ode. Мы передаем соответствующие значения через объект узла, чтобы указать на следующие элементы данных. Приведенная ниже программа создает связанный список с тремя элементами данных. В следующем разделе мы увидим, как пройти по связанному списку.


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

Обход связанного списка

Односвязные списки могут просматриваться только в прямом направлении, начиная с первого элемента данных. Мы просто печатаем значение следующего элемента данных, назначая указатель следующего узла текущему элементу данных.

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()

Когда приведенный выше код выполняется, он дает следующий результат: