python的链表基础知识点

yizhihongxing

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使用pyshp库读取shapefile信息的方法

    下面我将为你详细讲解Python使用pyshp库读取shapefile信息的方法。 一、 pyshp库的简介 pyshp库是Python处理shapefile文件的常用库,可以读取和写入shapefile文件。其中,shapefile是一种地理信息系统(GIS)文件格式,用于存储地理空间数据。 pyshp库中包含了ShapeRecords类和Shapefil…

    python 2023年6月3日
    00
  • 解决Python中定时任务线程无法自动退出的问题

    针对Python中定时任务线程无法自动退出的问题,可以采用以下攻略: 使用Timer类代替Thread类启动定时任务线程 在定时任务函数中使用Event类通信以实现线程退出 使用Timer类启动定时任务线程 在Python中,启动定时任务有很多种方式,其中一种比较常用的方式是使用Thread类来创建线程,然后在线程中执行定时任务。但是,在使用Thread类启…

    python 2023年5月19日
    00
  • python 哈希表实现简单python字典代码实例

    针对这个话题,我来为你详细讲解一下Python哈希表实现简单Python字典代码实例的完整攻略。 目录 前言 Python字典的基础知识 Python哈希表实现简单Python字典代码实例 示例说明 结论 前言 哈希表是一种根据关键字直接访问数据集合的数据结构,其可以通过一个关于关键字的函数,将所查找的关键字映射为集合中的一个位置(从而加快查找速度)。而Py…

    python 2023年5月13日
    00
  • Python实现随机森林RF模型超参数的优化详解

    Python实现随机森林RF模型超参数的优化详解 什么是随机森林? 随机森林(Random Forest,RF)是一种集成学习(Ensemble Learning)方法,通过集成多个决策树来实现分类、回归等任务。随机森林模型在机器学习中应用广泛,被认为是一种性能比较优秀的算法之一。 随机森林的参数 随机森林模型的参数主要包括两类: 决策树参数,如树的深度、每…

    python 2023年6月3日
    00
  • python tkinter 设置窗口大小不可缩放实例

    设置窗口大小不可缩放的常用方法 使用root.resizable方法,将其两个参数均设置为False “` python import tkinter as tk root = tk.Tk() root.title(“不可缩放窗口”) root.geometry(“300×300”) # 设置窗口大小为300*300 root.resizable(Fals…

    python 2023年5月14日
    00
  • 如何使用python检查句子中的拼写错误

    【问题标题】:How to check spelling mistakes in sentence using python如何使用python检查句子中的拼写错误 【发布时间】:2023-04-05 17:26:01 【问题描述】: 我想检查拼写错误的数量。在句子中 print(a) 输出是 myy nameq is xyz i am fromm abc …

    Python开发 2023年4月5日
    00
  • 详解Python脚本如何设置试用期

    当我们开发一个商业软件时,为了保护程序的知识产权和商业机密,我们通常会设置软件的试用期。本文将介绍如何通过Python脚本来实现软件试用期的设置。 1. 设置试用期的原理 软件的试用期本质上就是限制程序的使用时间。因此,我们可以通过获取当前时间和软件安装时间,并计算它们之间的时间差来判断软件是否逾期。 2. 实现步骤 2.1 获取当前时间 我们可以使用Pyt…

    python 2023年6月2日
    00
  • python实现可逆简单的加密算法

    下面是关于“Python实现可逆简单的加密算法”的完整攻略。 1. 可逆简单的加密算法简介 可逆简单的加密算法是一种基密码学的法,它可以将明文转换为密文,从而保证数据的安全性。与其他加密算法不同的是可逆简单加密算法可以通过相同的算法逆向解密,将密文还原为明文。这种算法通常用对敏感数据进行加密,如密码、银行卡号等。 2. Python实现可逆简单的加密算法 2…

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