首页 > 编程语言 >python中的链表

python中的链表

时间:2025-01-06 17:16:09浏览次数:1  
标签:current head return python next 链表 节点

在 Python 中,链表不是内置的数据结构,但可以通过类的方式实现自定义链表。以下是链表在刷算法题中常用的语法和操作方法。


1. 定义链表节点

链表节点是一个包含值和指向下一个节点的指针的结构:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val  # 节点值
        self.next = next  # 指向下一个节点的指针

2. 常见链表操作

1) 创建链表

从列表创建链表:

def create_linked_list(values):
    if not values:
        return None
    head = ListNode(values[0])
    current = head
    for val in values[1:]:
        current.next = ListNode(val)
        current = current.next
    return head

2) 遍历链表

从头节点遍历到尾节点:

def print_linked_list(head):
    current = head
    while current:
        print(current.val, end=" -> ")
        current = current.next
    print("None")

3) 插入节点

在链表中间插入新节点:

def insert_node(head, position, value):
    new_node = ListNode(value)
    if position == 0:  # 插入头节点
        new_node.next = head
        return new_node
    current = head
    for _ in range(position - 1):
        if current is None:
            raise IndexError("Position out of bounds")
        current = current.next
    new_node.next = current.next
    current.next = new_node
    return head

4) 删除节点

删除指定位置的节点:

def delete_node(head, position):
    if position == 0:  # 删除头节点
        return head.next
    current = head
    for _ in range(position - 1):
        if current is None or current.next is None:
            raise IndexError("Position out of bounds")
        current = current.next
    current.next = current.next.next
    return head

5) 翻转链表

原地翻转链表:

def reverse_linked_list(head):
    prev = None
    current = head
    while current:
        next_node = current.next  # 保存下一个节点
        current.next = prev  # 当前节点指向前一个节点
        prev = current  # 更新前一个节点
        current = next_node  # 移动到下一个节点
    return prev  # 返回新的头节点

3. 算法题中常用链表语法

1) 双指针

  • 快慢指针:寻找链表中点、判断是否有环。
def has_cycle(head):
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            return True
    return False
  • 两个指针相遇:判断链表是否有交点。
def get_intersection_node(headA, headB):
    if not headA or not headB:
        return None
    p1, p2 = headA, headB
    while p1 != p2:
        p1 = p1.next if p1 else headB
        p2 = p2.next if p2 else headA
    return p1

2) 倒序处理

  • 找到链表倒数第 n 个节点,使用快慢指针:
def remove_nth_from_end(head, n):
    dummy = ListNode(0, head)
    slow = fast = dummy
    for _ in range(n):
        fast = fast.next
    while fast.next:
        slow = slow.next
        fast = fast.next
    slow.next = slow.next.next
    return dummy.next

3) 使用递归

  • 链表递归解法,适合逆序输出等场景:
def reverse_print(head):
    if head:
        reverse_print(head.next)
        // 对head.val值进行操作

4) 合并链表

  • 合并两个有序链表:
def merge_two_lists(list1, list2):
    dummy = ListNode(-1)
    current = dummy
    while list1 and list2:
        if list1.val < list2.val:
            current.next = list1
            list1 = list1.next
        else:
            current.next = list2
            list2 = list2.next
        current = current.next
    current.next = list1 if list1 else list2
    return dummy.next

5) k 组翻转

  • 分组翻转链表,常用分段处理:
def reverse_k_group(head, k):
    dummy = ListNode(0)
    dummy.next = head
    pre = dummy
    while True:
        tail = pre
        for _ in range(k):
            tail = tail.next
            if not tail:
                return dummy.next
        nex = tail.next
        head, tail = reverse(head, tail)
        pre.next = head
        tail.next = nex
        pre = tail
        head = tail.next

4. 技巧总结

  1. 哑节点(Dummy Node):简化头节点处理,减少边界条件判断。
  2. 双指针:灵活移动指针解决链表长度相关问题,如快慢指针、相遇指针。
  3. 递归:自然表达链表的递归结构,适合逆序操作或链表分治。
  4. 分段处理:将链表分块操作,常用于分组翻转或批量处理。

通过这些基础语法和模板,刷算法题中的链表问题会更加得心应手。

标签:current,head,return,python,next,链表,节点
From: https://www.cnblogs.com/lmc7/p/18655724

相关文章

  • python中的队列
    在Python中,队列(Queue)是一种常见的数据结构,特别是在刷算法题时经常被用到。以下是队列相关的基础语法及其在算法题中的应用总结。1.队列的基本定义队列遵循FIFO(先进先出)原则,可以通过以下方式实现:1)collections.dequedeque是双端队列,支持快速的两端插入和删除操作。fro......
  • (2024最新毕设合集)基于Django的电影资讯共享平台-10223|可做计算机毕业设计JAVA、PHP、
    目录摘要Abstract1绪论1.1研究背景1.2研究意义1.3论文结构与章节安排2电影资讯共享平台系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3 社会可行性2.1.4法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.......
  • DL00564-图卷积神经网络GCN心电图信号ECG心律失常检测python完整代码
    图卷积神经网络(GraphConvolutionalNetwork,GCN)作为一种图神经网络(GraphNeuralNetwork,GNN)的代表,近年来在各类数据结构上表现出了优异的性能,尤其是在处理具有图结构数据时。心电图(ECG,Electrocardiogram)信号分析,特别是心律失常的检测,是医学信号处理中一个重要且挑战性的任务......
  • Python开发环境部署教程
    本教程将详细介绍如何在Windows系统上配置Python开发环境,包括安装Python、配置虚拟环境以及使用VSCode进行开发,适合新手和需要精细配置的开发者。1.安装Python1.1下载Python访问Python官网.选择最新版本的Python进行下载(建议下载64-bit版本)。1.2判断选......
  • C#基于pythonnet调用Python的pyd文件,实现交互
    privatevoidTestPython(){try{//python环境路径stringpathToVirtualEnv=@"H:\ProgramData\anaconda3\envs\python39";Environment.SetEnvironmentVariable("PATH",pathToVirtualEnv,EnvironmentVari......
  • python毕设 高校快递代取系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校快递代取系统的研究,现有研究多侧重于快递代取服务的基本流程与效率提升方面。专门针对高校这一特殊环境下,综合考虑用户、快递......
  • python毕设 新能源汽车租赁与电池更换系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着全球对环境保护和可持续发展的关注日益增加,新能源汽车作为一种环保、高效的交通工具得到了广泛的推广和应用。在国内,新能源汽车产......
  • 2024实测验证可用的股票数据接口集合:python、JavaScript 、JAVA等实例代码演示教你如
    最近一两年,股票量化分析越来越受欢迎了。想要入行,首先得搞定股票数据。毕竟,所有量化分析都是建立在数据之上的,实时交易、历史交易、财务、基本面,这些数据咱们都得有。咱们的目标就是挖掘这些数据中的价值,来指导咱们的投资策略。为了找数据,我可是尝试了各种方法,自己动手写过......
  • 动手学深度学习-python基础知识介绍part1
    基础详解-part1importtorchx=torch.arange(12)xx.shapex.numel()#数组中元素的总数#修改形状x.reshape(3,4)torch.zeros((2,3,4))#两层,三行,四列print(torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]).shape)#二维#两个框表示二维,三个表示三维print(torch.tens......
  • C#基于pythonnet调用Python的pyd文件,实现交互
    privatevoidTestPython(){try{//python环境路径stringpathToVirtualEnv=@"H:\ProgramData\anaconda3\envs\python39";Environment.SetEnvironmentVariable("PATH",pathToVirtualEnv,EnvironmentVari......