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

遍历链接列表

从第一个数据元素开始,单向链表只能在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

 

转自:http://codingdict.com/article/4838

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表中的节点按照顺序连接在一起,形成一个链式结构。 下面是Python单向链表的基本实现方式: 1. 定义节点类:首先定义一个节点类,包含两个属性:数据元素和指向下一个节点的指针。 ```python class Node: def __init__(self, data): self.data = data self.next = None ``` 2. 定义链表类:链表类包含若干个节点,以及对链表进行操作的方法。 ```python class LinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if self.head is None: self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node def insert(self, data, position): new_node = Node(data) if position == 0: new_node.next = self.head self.head = new_node else: current = self.head for _ in range(position - 1): if current.next is None: raise IndexError("Index out of range") current = current.next new_node.next = current.next current.next = new_node def delete(self, position): if self.head is None: raise IndexError("Index out of range") if position == 0: self.head = self.head.next else: current = self.head for _ in range(position - 1): if current.next is None: raise IndexError("Index out of range") current = current.next if current.next is None: raise IndexError("Index out of range") current.next = current.next.next def get(self, position): if self.head is None: raise IndexError("Index out of range") current = self.head for _ in range(position): if current.next is None: raise IndexError("Index out of range") current = current.next return current.data def size(self): count = 0 current = self.head while current: count += 1 current = current.next return count ``` 以上是一个简单的Python单向链表的实现,包括了向链表末尾添加节点、在指定位置插入节点、删除指定位置的节点、获取指定位置的节点值以及获取链表长度等基本操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值