【Python数据结构与算法】链表

本文详细介绍了线性结构和链式结构的区别,重点讲解了单链表和循环双链表的数据结构及其实现方法,包括节点类和链表类的设计,以及常见的链表操作如查找、插入、删除等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018-7-18 北京阴 大毛夏令营过啦!

线性结构:内存连续,可以通过下标访问——如list
链式结构:内存不连续,通过链接指针的方式指向下一个,不可以通过下标访问;但是追加元素方便;查找时需要遍历

单链表

通过指针的方式将节点一个个串起来
root(根节点,是一个入口,可以进行遍历) — head — node — node — tail

每一个node包含:value和next(指向下一个元素) —— node类

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

还有单链表类:data和method

class LinkedList(object):
    """ 链接表 ADT
    [root] -> [node0] -> [node1] -> [node2]
    """

单链表的方法有:

__len__
append
appendleft
iter_node
__iter__
remove
find
popleft
clear

实现这些方法的时候,应当从指针考虑,即是用好next

链表操作均时间复杂度
linked_list.append(value)O(1)
linked_list.appendleft(value)O(1)
linked_list.find(value)O(n)
linked_list.remove(value)O(n)

append和appendleft只需要在最右或者最左插入一个节点即可
而find和remove则需要遍历整个链表(remove也需先遍历)
而且单链表只能单向遍历(?)

循环双链表

双链表即是双端链表

相比单链表来说,每个节点既保存了指向下一个节点的指针,同时还保存了上一个节点的指针。

class Node(object):
    def __init__(self, value=None, prev=None, next=None):
        self.value, self.prev, self.next = value, prev, next

和单链表相比,只多了一个prev

循环双链表的方法有:

__len__
append
appendleft
iter_node
iter_node_reverse
remove

注意当appende、remove等操作时,对node的指针操作时,如指向tailnode、root,并不影响之前tailnode、root之间的链接,只有对tailnode、headnode和root等对象的指针进行重指向的操作时,才会使链接断裂。
理解这一点以后,就很容易对链表进行操作了。

链表(Linked List)是一种常见的数据结构,它是由一系列节点组成的,每个节点包含一个数据元素和一个指向下一个节点的指针。链表中的节点可以在运行时动态添加或删除,这使得链表在某些场景下比数组更加适用。 在 Python 中,链表可以使用类来实现。下面是一个简单的链表实现: ```python class Node: def __init__(self, data): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def add_node(self, data): new_node = Node(data) if self.head is None: self.head = new_node else: current = self.head while current.next is not None: current = current.next current.next = new_node def remove_node(self, data): if self.head is None: return if self.head.data == data: self.head = self.head.next else: current = self.head while current.next is not None: if current.next.data == data: current.next = current.next.next break current = current.next def print_list(self): current = self.head while current is not None: print(current.data, end=' ') current = current.next print() ``` 这个链表实现包含两个类:Node 和 LinkedList。Node 表示链表中的节点,LinkedList 则是整个链表。Node 类中包含了数据元素和指向下一个节点的指针,LinkedList 类中包含了链表的头节点。add_node 方法用于向链表中添加节点,remove_node 方法用于从链表中删除节点,print_list 方法用于打印整个链表链表的常见操作包括遍历、插入、删除等。下面是一些链表的常见操作: 1. 遍历链表 遍历链表可以通过一个 while 循环实现,从头节点开始遍历,直到遇到 None 为止。 ```python def print_list(self): current = self.head while current is not None: print(current.data, end=' ') current = current.next print() ``` 2. 插入节点 在链表中插入节点需要注意节点的顺序。可以先找到要插入的位置,然后将新节点的指针指向下一个节点,再将前一个节点的指针指向新节点。 ```python def insert_node(self, data, position): new_node = Node(data) if position == 0: new_node.next = self.head self.head = new_node else: current = self.head for i in range(position - 1): current = current.next if current is None: return new_node.next = current.next current.next = new_node ``` 3. 删除节点 在链表中删除节点需要先找到要删除的位置,然后将前一个节点的指针指向下一个节点。需要注意删除头节点和删除中间节点的情况。 ```python def remove_node(self, data): if self.head is None: return if self.head.data == data: self.head = self.head.next else: current = self.head while current.next is not None: if current.next.data == data: current.next = current.next.next break current = current.next ``` 链表的时间复杂度为 O(n),其中 n 是链表的长度。链表的优点是可以在运行时动态添加或删除节点,并且可以节省内存空间。缺点是不能像数组那样随机访问元素,需要从头节点遍历整个链表才能访问到某个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值