python的链表基础知识点

Python的链表基础知识点

链表的定义

链表是一种常见的数据结构,它的节点包含两个部分:数据和指向下一个节点的指针。链表的最后一个节点指向None。

Python中链表的定义可以使用class来实现。例如定义一个链表节点的类:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

每个链表节点的数据存储在val中,指向下一个节点的指针保存在next中。

链表的基本操作

链表的基本操作包括:

  1. 根据值查找节点
  2. 在指定节点之后插入新节点
  3. 删除指定节点

以下是详细的实现方法:

根据值查找节点

以下代码展示了如何查找给定链表中第一个值为x的节点:

def find_node(head, x):
    curr = head
    while curr and curr.val != x:
        curr = curr.next
    return curr

参数head代表链表的头节点,参数x为需要查找的值。从头节点开始,遍历链表中的每个节点,直到找到值为x的节点或遍历到链表的末尾。如果找到值为x的节点,返回该节点;如果找不到值为x的节点,返回None。

在指定节点之后插入新节点

以下代码展示了如何在链表中指定的节点p之后插入一个新节点:

def insert_after(p, new_node):
    new_node.next = p.next
    p.next = new_node

参数p代表要在其之后插入新节点的节点,参数new_node为要插入的新节点。将新节点的next属性指向p的下一个节点(也就是p原本指向的节点),再将p的next属性指向新节点,即可完成插入新节点的操作。

删除指定节点

以下代码展示了如何删除链表中指定的节点p:

def delete_node(head, p):
    if not head:
        return None
    if head == p:
        return head.next
    curr = head
    while curr.next and curr.next != p:
        curr = curr.next
    if curr.next:
        curr.next = curr.next.next
    return head

参数head代表链表的头节点,参数p为要删除的节点。如果链表为空,直接返回None。如果要删除的节点就是头节点,将头节点指向下一个节点即可完成删除操作。如果不是头节点,需要遍历整个链表,找到节点p的前驱节点,然后将前驱节点的next属性指向p的下一个节点,即可完成删除操作。

示例说明

示例1

以下代码展示了如何使用链表来实现LRU(最近最少使用)算法:

class LRUCache:

    def __init__(self, capacity: int):
        self.capacity = capacity
        self.hashmap = {}
        self.head = ListNode(0)
        self.tail = ListNode(0)
        self.head.next = self.tail
        self.tail.prev = self.head

    def move_to_tail(self, node):
        node.prev.next = node.next
        node.next.prev = node.prev
        node.prev = self.tail.prev
        self.tail.prev.next = node
        node.next = self.tail
        self.tail.prev = node

    def get(self, key: int) -> int:
        if key in self.hashmap:
            node = self.hashmap[key]
            self.move_to_tail(node)
            return node.val[1]
        else:
            return -1

    def put(self, key: int, value: int) -> None:
        if key in self.hashmap:
            node = self.hashmap[key]
            node.val = (key, value)
            self.move_to_tail(node)
        else:
            if len(self.hashmap) == self.capacity:
                node = self.head.next
                del self.hashmap[node.val[0]]
                node.val = (key, value)
                self.hashmap[key] = node
                self.move_to_tail(node)
            else:
                node = ListNode((key, value))
                self.hashmap[key] = node
                node.prev = self.tail.prev
                self.tail.prev.next = node
                node.next = self.tail
                self.tail.prev = node

这是一个LRUCache的实现,使用了链表来维护访问顺序。具体实现方法是,使用一个哈希表来存储key-value的键值对,使用一个双向链表来维护访问顺序。每次访问或添加一个元素时,将其移动到链表的末尾。如果缓存已满,则删除链表头部的元素。

示例2

以下代码展示了如何使用链表来实现一个栈:

class StackNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class MyStack:

    def __init__(self):
        self.head = None

    def push(self, x: int) -> None:
        node = StackNode(x)
        node.next = self.head
        self.head = node

    def pop(self) -> int:
        if self.head:
            x = self.head.val
            self.head = self.head.next
            return x

    def top(self) -> int:
        if self.head:
            return self.head.val

这是一个栈的实现,使用了链表来存储栈中的元素。入栈操作时,将新元素插入到链表头部。出栈操作时,返回链表头部的元素,并将头节点指向下一个元素。获取栈顶元素的操作同样是返回链表头部的元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python的链表基础知识点 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python逐行读取文件内容的三种方法

    当我们需要处理大型文件时,可能会需要逐行读取文件的内容。Python为我们提供了多种读取文件的方式,以下是Python逐行读取文件内容的三种方法: 1. 使用for循环逐行读取文件内容 with open(‘file.txt’, ‘r’) as f: for line in f: print(line.strip()) 这种方法会一次读取一行,每次循环会返回…

    python 2023年6月5日
    00
  • Python list和str互转的实现示例

    以下是详细讲解“Python list和str互转的实现示例”的完整攻略。 Python list和str互转 在Python中,我们经常需要将list和str类型相互转换。下面将分别介绍如何将list转换str,以及如何将str转换为list。 list转str 将list转换为str可以使用join()方法,该方法将列表中的元素连接成一个字符串。下面是一…

    python 2023年5月13日
    00
  • python如何随机生成高强度密码

    生成高强度密码是一个很常见的需求,Python作为一门流行的编程语言,提供了许多库和模块可以帮助我们轻松地生成高难度密码。以下是详细讲解如何使用Python随机生成高强度密码的攻略: 使用Python内置的secrets模块生成密码 Python 3.6及以上版本内置的secrets模块提供了生成密码的功能。它可以生成强壮、不可预测的密码,适合用于用户账户、…

    python 2023年6月3日
    00
  • 如何把外网python虚拟环境迁移到内网

    将外网Python虚拟环境迁移到内网需要考虑到两个主要问题:如何将虚拟环境中的依赖项导出,并在内网中重新安装这些依赖项;以及如何将虚拟环境中的Python解释器和库文件复制到内网中。 以下是一个完整的攻略,包括两个示例,用于演示如何将外网Python虚拟环境迁移到内网。 步骤1:导出虚拟环境中的依赖项 首先,我们需要导出虚拟环境中的依赖项,以便在内网中重新安…

    python 2023年5月15日
    00
  • 一文带你了解Python中的输入与输出

    一文带你了解 Python 中的输入与输出 Python 语言有着丰富的输入输出方式,本文将从以下几个方面来讲解: 标准输入输出 文件的读写 字符串的读写 举例说明 标准输入输出 在 Python 中,可以使用 input() 函数用于从控制台获取用户输入,使用 print() 函数将结果输出到控制台。 示例: # 获取用户输入 name = input(‘…

    python 2023年6月5日
    00
  • pytest allure添加环境信息实例讲解

    Pytest Allure 添加环境信息实例讲解 描述 Pytest Allure 是一个用于美化测试报告的 Python 模块,可以将测试结果输出为漂亮的 HTML 报表,提供多种可视化的测试数据报告和图表。其中添加环境信息可以让我们在测试过程中了解测试环境的情况,例如python版本,浏览器版本,操作系统等等。 本文将主要介绍如何在 Pytest 中使用…

    python 2023年6月3日
    00
  • python中list方法详解

    Python中list方法详解 在Python中,列表(list)是一种常用的数据类型,它可以存储多个元素,并且支持动态扩容。列表提供了许多方法,可以方便地对列表进行操作。本文将细讲解Python列表的方法,包括列表的增删改查、排序、复制等方面。 列表的增删改查 增加元素 append方法 append方法用于在列表的末尾添加一个元素。具体来说,它的语法如下…

    python 2023年5月13日
    00
  • pandas 如何保存数据到excel,csv

    以下是详细的 pandas 保存数据到 Excel 和 CSV 文件的实例教程,包含手动创建数据和读取外部数据两个示例。 保存数据到 Excel 文件 手动创建数据 假设我们要保存以下数据到 Excel 文件: id name age 0 1 Tom 18 1 2 Jack 22 2 3 Mary 20 导入 pandas 库和数据: import pand…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部