使用python实现链表的基本结构并对链表进行反转(使用迭代和递归两种方式),加上一些个人理解(python并行赋值等)

Python 数据结构实现,递归算法 链表 阅读详情

在这里插入图片描述

在python数据结构中,常用的有序数组为列表,列表的好处很多,使用也很方便。列表在append元素时时间复杂度为O(1),但是在insert时复杂度就很高了,因为其需要先找到要插入的索引位置,这个索引之后的所有数据的索引都会+1,导致较耗时;同理删除某个元素也是。


链表

链表是一种数据结构,对于上面提到的在某个位置插入或删除元素的功能能以O(1)的复杂度完成,但缺点是在寻找元素时复杂度为O(n)。这里简要介绍一下链表:实际上链表就是将一系列有顺序的数据以变量的形式储存在内存中,每个变量的一个next属性为按一定顺序的下一个变量,下一个变量的next属性又链接到下下个变量。这里的next是为了方便理解,实际上设置为其它名字也可以,因为这是我们手动给它加上的属性而已嘛。

比如创建一个a→b→c→d→e的链表,a.next就是b这个变量,b.next就是c这个变量,依次类推。当然由于元素都是各种不同的东西(如数字,字符串甚至列表或者字典等),因此每个变量本身还有自己的一个属性才行,这个属性就是变量本身代表的内容。因此这里的a,b,c,d,e可以是分别代表1,2,3,4,5五个元素的,这种属性值才是数据真实存在的意义所在,通过链表储存就让这些数据变得有顺序且利于管理了。因此根据上面提到的,链表是通过创建非常多个变量来储存表内容的,因此当变量将内存占满后,链表就会崩溃哦(当然这种情况应该不太可能会发生,现在电脑的内存一般都较大了)。

下面的一个图简单展示了一个简单的链表。(keys是指a,b,c,d,e,values是指1,2,3,4,5或者"one",“two”,“three”,“four”,"five"这些分别被a,b,c,d,e储存的值(可以是任何内容,这里展示了数字和字符串)。这里的keys和values是为了方便理解,不要和字典搞混啦。)
在这里插入图片描述

链表的基础实现

ok,对链表大致有了解了之后,这里实现一下最基础的链表(链表应该有许多类似列表中的功能,如append,remove等,这里就不加入了,大家可以去看看别人的相对更为完整的实现方式)

# 首先,我们能看到上面每一个链表中的变量都有一个属性值,
# 如果要在代码中的每一行分别对这些所有的变量分别赋值,那么也太麻烦了,
# 因此利用python对象的特性,创建一个节点类,在节点类中定义属性值和next属性的来源就可以了。
# 这样每次创建节点时只需要调用一下这个类即可。
# (这里提到的节点就是上面提到的变量,因为链表是有顺序的一一连接的形式,因此称为节点也较为贴切。)
class Node:
	def __init__(self, item):
		# item表示某个节点所储存的值
		self.item = item
		self.next = None  # next表示其next属性链接的下个变量,默认为None

# 设计好了节点类之后,就可以开始生成链表啦
# 这里先来一个最简单的链表
a = node(1)
b = node(2)
c = node(3)
d = node(4)
a.next = b
b.next = c
c.next = d
# 这里的链表结构就是 a→b→c→d,要查看链表结构可以不断执行next知道next为None(可以做成生成器)
# 显然,这里这样创建链表显得很初级,也比较低效,要使操作链表变简单,最好还是设计一个链表类
class link_list:
	def __init__(self):
		self.head = None   # head表示链表的起始节点
	# 下面还有很多方法可以写,这里我就不多写啦

反转链表

迭代的解法

接下来说一下反转链表,反转链表是leetcode中的一道比较经典的题。反转链表也就是要将链表所有元素的顺序反过来,比如这里a→b→c→d就是变为d→c→b→a,其实想想也简单,就是将链表中的每个元素的next变成上一个,但是同时要注意要先记录下一个要变换方向的元素。为什么呢?比如已经将ab间的方向转向后,变为了a←b c→d时,这时候b.next已经不再是c了,因此我们需要多加一个中间变量来让我们记住b,下次让c.next变为b就行了。之后不断重复上述步骤就可以了。我们先来解决一次,这里只写解决的函数。

def rever_list(self):
	cur, pre = self.head, None  # cur表示当前循环到的节点
	while cur:
		tmp = cur.next   # 先创建一个临时变量
		cur.next = pre   # 当前节点的next属性变为前一个节点
		pre = cur        # 这里pre变到cur的位置,cur才能去到下一个节点,
						 # 这就是上面提到的要记住最开始c的上一个节点是b
		cur = tmp        # 这里就是要向下一个节点移动,再不停的转换方向
	return pre

上面的函数运行后,整个链表的方向被反过来了,因此head(初始节点)位置也变化了,观察函数会发现头节点是被pre这个变量储存着的,因此最后只需要return pre的值,就能从头节点位置不断提取next值并获取到整个链表被反转后的顺序。这里要注意,如果再使用最开始设置的起点(如上面例子中的a),是获取不到完整链表的(而且也是错误结果)。

这里想要提醒的是,根据上面的例子,能够更加体会到链表是一个以变量储存结构的数据结构,因此一个链表是绝对不会被任何一个变量给完全描述的,不像列表一样有一个列表名,也不像字典一样有字典名,链表没有名字,要获取链表的每个值,就需要从链表的头部节点去获取之后的每一个节点,这也是链表中查找某个元素比较慢的原因(要去寻找每一个节点)。

递归解法

理解方式1

除了迭代之外,还有一个递归方式可以解决反转的问题,而且这个递归也是非常巧妙的,也被某些人称作递归的范本。递归我们都知道是不断地去在原函数中去向内深入,直到到达递归的终止条件存在的位置,之后再由终止条件向外回溯,直到回溯到最外层之后就结束。

话不多说先上代码(这里的代码是参考leetcode的代码哦):

def reverseList_digui1(self):
    head = self.head  # 先将最开始进递归的位置传入,也就是head(最初的头节点)
    
    def recur(cur, pre):   
    # 在内部创建递归函数,而在reverseList_digui里创建这个递归函数的原因
    # 是因为这是在一个类里面的函数,不能直接传入cur, pre,因此在内部创建递归函数是最理想的
    # (实际上就是个闭包函数),这样可以在内部制定变量再不断调用。
        if not cur: return pre   # 这里是递归终止条件
        res = recur(cur.next, cur)   # 这里是在不断调用递归函数本身
        cur.next = pre         # 这里把pre赋值给cur.next,也就是让某个节点处的节点反转了方向
        return res
            
    return recur(head, None)  
    # 闭包函数的基本,在reverseList_digui函数内调用递归函数用以开启递归

看了代码后我是一脸懵,所以先来捋一捋吧,递归最重要是找到结束条件,比如创建一个a=0→b=1→c=2→d=3→e=4→f=5这样的链表,递归函数是不断的传入(cur.next, cur),也就是当前节点的下一个和当前节点,而且每一轮向里运行就把上一轮的cur.next变为了cur,cur又变为了pre(程序识别的,因为定义时是定义的def recur(cur, pre)).

而调用递归函数的上一行的if not cur: return pre语句由于没有符合条件,因此是不会运行的,直到传入的cur.next变成了None,同时cur是最后一个节点时,if not cur判断为True,这时候return pre,这里的pre也就是f(值为5),因此上一级的递归获取的res为5,这时候上一级的pre还是之前那一级所传入的pre(为4),cur为5这时候的cur.next = pre就用于将5的下一级节点变为4,再之后return res,可以看到res并没有改变(还是5),但是cur和pre由于之前创建时分别是(1,0)(2,1)(3,2)等,在向外回溯的过程中通过cur.next = pre将这些方向依次都改变了。最终在输入的第一个recur(head, None)也回溯出来后,res的值仍然是5,也就代表着新的头节点,从这个头节点不断的调用next就能将新的反转后的链表列出来。

总结一下,递归函数在这里完成了什么事情呢?

  • 使函数不断递归到最后的终止条件,然后将终止条件时的结果(即最后一个节点)取出来,作为最终的结果
  • 利用递归包含有回溯的特性,在回溯的每一轮对链表的两个元素的方向进行反转(并且是从后往前的)

这样一理解是不是感觉很神奇,递归就是帮我们找到了最后一个节点,然后再从最后一个节点开始向之前利用递归的特性来对方向进行反转。

理解方式2

除了上面的理解方式,还有另一种理解方式相对较简单,也就是我们使用递归,但是不优先考虑终止条件,而是从最后的结果入手。也就是比如当最后的几个节点全部已经被反转了,只剩最后一个节点了,那么也就是说recur(head.next)已经完成了,只剩下recur(head)这个最外面一层还没有完成了。
在这里插入图片描述

那这时候我们要做什么呢?相当于我们在递归函数里要怎么去将这最后一个没有完成反转的节点完成反转。那么可以使用head.next.next = head, head.next =None,也就是要把最后一个节点反转,再把head自身的next属性去掉。

因此代码实现如下:

def reverseList_digui2(self):
	head = self.head  # 先将最开始进递归的位置传入,也就是head(最初的头节点) 
	def recur(head):
	    if not head.next: return head 
	    res = recur(head.next)
	    head.next.next = head
	    head.next = None
	    return res	            
    return recur(head)

这种理解方式可能相对更简单,实现起来也挺简单,可以多理解一下呀。但其实仔细观察也会发现和上面的实现方式几乎是一样的,如果仔细观察下面方式的终止条件,也会发现是递归到没有下一个节点终止。(要注意这里的head可能会误导人,这里的head只是最开始为head,进入递归后head表示的是前面的那个节点)。与上面解法的不同在于这里少了pre这个指针,而仅使用了head.next这一个指针,先把head.next的next变为head(即反转),再把head自身的next属性变为None(即删去最开始存在的方向)。其实这里的head.next属性不变为None对于开始位于链表后面的元素来说是没有影响的(因为后面加上的每个节点新的next会将之前存在的next属性顶替掉),但是对于最开始的0,1节点的问题就会互相产生环(1.next = 0, 0.next = 1)。对于上面的解法不会产生这种现象则是因为开始传入的为(head,None)会把初始节点的next转为None。

python并行赋值

上面的反转链表的后面四行,其实是可以写成一行的,这就是Python里的并行赋值(也就是在一行中完成对多个内容的赋值)。

tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
# 可以表示为:
cur.next, pre, cur = pre, cur, cur.next

上面的并行赋值是从左边运行到右边的,也就是先是cur.next变为了pre,pre再变为cur,cur变为cur.next,但是要注意这里最后的cur.next还是最开始的cur.next,因此如果使用cur.next = pre;pre = cur; cur = cur.next这样三句是会报错的,也就是cur最后要改变成最初始的cur.next,而不是变为在cur.next变为pre之后的cur.next。

从这个例子中理解一下,也就是说在同一行中写的语句虽说是从左到右执行,但是使用到的变量值都是这一行之前所存在的变量值,在行内即使有改变值也并不会影响之后所使用到的变量值。

这里再举个例子:

a,b,c = 1,2,3
a,b,c = a+b, a-b, b+c
print(a,b,c)
# 这里的输出为3 -1 5
# 分别对应着最开始的a,b,c三个值的a+b,a-b,b+c的结果

叮

参考:https://leetcode-cn.com/problems/UHnkqh/solution/jian-zhi-offer-ii-024-fan-zhuan-lian-bia-m8go/
参考:https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247484467&idx=1&sn=beb3ae89993b812eeaa6bbdeda63c494&scene=21#wechat_redirect

Python 递归 深入理解递归 Python递归剖析,绝对让你看懂! 递归再特定的场景下,非常实用,巧妙的递归设计能解决很多问题,文章主要列出了递归的各种思想和丰富的使用案例! 阅读详情

相关推荐

链表反转问题 1:整体反转

leetcode 206:反转链表 难度等级:简单 ⭐ 迭代 定义前后两个指针,遍历的时候将后面指针的 next 赋值给前面,形成反向链表。 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution(object): def reverseList(self, head: Li

阿飞的博客 602

python实现链表的反转递归_用递归法反转单链表

链表是一种递归结构,因此将其与函数式一起使用将产生最佳结果。在您的程序中,您已经使用过程样式和mutable节点实现了一个链接列表,您将随着时间的推移更改data和{}的值。虽然这可能感觉像是一种直观的方法,但我想重点关注一种不可变的规则,它将我们从严重的状态复杂性中解放出来。在首先,我们修复了node构造函数。我们在构建新节点时设置这两个属性,因为它们在程序中稍后不会更改-class node:...

weixin_28842269的博客 649

基于STM32的可穿戴式多生理参数实时监测与预警系统

针对传统可穿戴健康设备存在的生理参数监测种类单一、数据处理依赖云端导致响应滞后、续航能力弱等问题,设计一种基于STM32的可穿戴式多生理参数实时监测与预警系统。系统以STM32L476RG低功耗微控制器为核心,集成心率血氧传感器、体温传感器、血压传感器,实现人体心率、血氧饱和度、体温、收缩压/舒张压的同步采集;通过边缘端轻量化数据处理算法完成参数异常判定,结合低功耗硬件设计与软件休眠策略,在保证监测精度的同时延长续航。测试结果表明,系统心率监测误差≤2次/分钟,血氧饱和度误差≤2%,体温误差≤±0.2℃,血

m0_74026776的博客 2039

数据结构笔记——链表

数据结构笔记——链表

关于我的学习记录 2551

基于ROS的室内移动机器人自主导航技术

随着机器人技术的发展,近些年来室内移动机器人的研究热度越来越高。本文主要利用ROS操作系统对室内移动机器人的建图定位与自主导航关键技术进行研究。 ROS是目前开发较为完整具有广阔应用前景的开源机器人操作系统,具有分布式、模块化、代码复用等优良特点。同时ROS还提供了许多开源库,在这些库的基础之上研究同时定位与地图构建和机器人自主导航技术可以节省大量时间。 ORB-SLAM2是比较优秀的视觉SLAM算法之一,它具有计算量比较小、能够实时运行等优点。在介绍ORB-SLAM2的框架之前,首先会介绍视觉SLAM的一

weixin_44553616的博客 1909

不会ps,你也可以成为ps高手,最强傻瓜式人像一键磨皮美白瘦脸美妆PS插件

比如:美肤是用来去斑点的,如果效果不太理想,就加大百分比,反之就减小。瘦脸如果脸胖的就打开,正常的就关闭。所谓的一键调节,要不只能调节一种效果,要不就是个预设,然后让你自己再调。同时,该软件还加入了贴心的批量处理功能,能同时处理上千张照片,让您喝着茶也能将工作做完。、自动检测照片中的人脸,包括鼻子,嘴巴,耳朵,眼睛和眉毛。、依托强大的脸部识别功能,可以高效的对人物全身皮肤进行智能识别,处理,使肤质平滑、过渡均匀。,这是网上下载的模糊照片,经过简单处理,你可以发现,眼睛变的更亮,皮肤更白,眼袋消失。

心语家园 - www.xinyucn.cc 2899

Python next方法应用场景

Python next方法应用场景

summerriver1的博客 942

YOLO26改进 - C3k2 | C3k2 融合 ARConv 自适应矩形卷积:动态调整卷积核形状与采样点 | CVPR 2025

本文介绍了将自适应矩形卷积(ARConv)模块与YOLO26相结合的方法。ARConv是针对遥感图像全色锐化任务设计的创新卷积模块,可自适应调整卷积核形状与采样点数量,解决传统卷积刚性限制,实现高效特征提取。其工作流程包括学习卷积核高度和宽度、选择采样点数量、生成采样图、卷积实现与空间自适应增强。我们将集成ARConv的C3k2_ARConv模块引入YOLO26,对相关代码进行修改和注册,并配置了YOLO26 - C3k2_ARConv.yaml文件。实验脚本显示,该结合方式应用于目标检测任务。

魔改工程师的博客 496

Python算法入门day8——链表

一、链表 【链表的定义】 链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。通过节点之间的互相连接,最终串联成一个链表。 class Node(object): def __init__(self,item): self.item=item self.next=None a=Node(1) b=Node(2) c=Node(3) a.next=b b.next=c print(a.next.item) #2 p

m0_48936146的博客 1478

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1604

计算机视觉安防监控升级:人脸识别与行为异常检测

计算机视觉安防监控升级:人脸识别与行为异常检测 ,人工智能,计算机视觉,大模型,AI,本文将深入探讨人脸识别与行为异常检测技术在安防监控中的应用,包括技术原理、算法实现、应用场景以及面临的挑战与解决方案。通过实际案例和代码示例,帮助读者更好地理解和掌握这些技术,为推动安防监控系统的智能化升级提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 23万+

Python实现链表反转(迭代法与递归法)

Python实现链表反转 链表反转(while迭代实现): 链表的反转引入一个cur_node变量,表示当前节点;同时需要引入一个变量new_link表示反转后的新链表;while循环内还需中间变量tmp存放当前节点的后继节点,防止原链表数据丢失。 在while循环内(循环条件为 cur_node !=None,若设置为cur_node.next将导致最后一个节点无法反转到新链表): 首...

one_Salted_FishGG的博客 4372

【DRAM存储器六十七】DDR5介绍--训练相关之write leveling

详述DDR5 write leveling细节

highman110的博客 287

【经典算法】秒懂反转链表

经典链表反转问题秒懂解法!

不积跬步,无以至千里! 1276

人工智能---什么是Transformer?

Transformer是一种强大的神经网络架构,最初由Google的研究人员在论文《Attention is All You Need》中提出,用于自然语言处理任务,特别是在机器翻译方面取得了巨大成功。Transformer的核心思想是完全基于自注意力机制(self-attention mechanism)来实现序列到序列(sequence-to-sequence)的学习。它在自然语言处理(NLP)和其他序列到序列任务中表现出色,逐渐成为该领域的主流模型。近些年也逐渐在自动驾驶领域有所应用。

智能汽车人的博客 3955

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python核心编程:python算法题 链表反转详解

本主要介绍了python算法题 链表反转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 链表的反转是一个很常见、很基础的数据结构题,输入一个单向链表,输出逆序反转后的链表,如图:上面的链表转换成下面的链表。实现链表反转有两种方式,一种是循环迭代,另外一种方式是递归。 第一种方式:循坏迭代 循坏迭代算法需要三个临时变量:pre、head、next...

python核心编程 471

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[LeetCode-Python版]206. 反转链表(迭代+递归两种解法)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

m0_69281817的博客 695

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python链表反转-python链表反转如何实现?这才是python强大功能的一部分

【摘要】众所周知,python的功能十分强大,那么python链表反转如何实现?这才是python强大功能的一部分,因为链表是编程工具的核心之一,所以掌握python链表反转如何实现?这才是python强大功能的一部分,环球网校的小编希望您的python之路越来越顺利。本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下:Python实现链表反转1、python链表反转如何...

weixin_39889792的博客 390

LeetCode 206 Reverse Linked List--反转链表--迭代与递归解法--递归使用一个临时变量,迭代使用3个

LeetCode 206 Reverse Linked List–反转链表 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL Follow up: A linked list can be rever...

个人博客 466

Python:反转链表的三种方式 【算法村E2链表反转笔记(青铜)】

反转链表是链表问题中相当常见的一类,在面试题中经常遇见,因此牢牢掌握很有必要~本文提供反转链表的三种方式:第一种,迭代;第二种,迭代+虚拟头节点,第三种,递归。

Huanghooo的博客 1054

LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

翻译反转一个单链表。原文Reverse a singly linked list.分析我在草纸上以1,2,3,41,2,3,4为例,将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致):有了这个图,那么代码也就自然而然的出来了:ListNode* reverseList(ListNode* head) { ListNode* newHead = NULL; wh

nomasp 6502

LeetCode 206 反转链表的理解与分析 Python3

原题链接:LeetCode 206 反转链表 反转一个单链表。 就直接按照进阶的要求自己吧。 解法一 迭代法+双指针 def reverseList(head): if not head: return None pre, cur = head, head.next while cur: # temp 为临时变量 用于保存下一个c...

Key Board的博客 324

python单链表反转_单链表反转的原理和python代码实现

链表是一种基础的数据结构,也是算法学习的重中之重。其中单链表反转是一个经常会被考察到的知识点。单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容易。现在来给大家简单介绍一下单链表反转算法实现的基本原理和python代码实现。算法基本原理及python代码1、方法一:三个指针遍历反转算法思想:使用3个指针遍历单链表,逐个链接点进行反转。(1)分别...

weixin_39533742的博客 294

python实现单链表反转_单链表反转的原理和python代码实现

链表是一种基础的数据结构,也是算法学习的重中之重。其中单链表反转是一个经常会被考察到的知识点。单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容易。现在来给大家简单介绍一下单链表反转算法实现的基本原理和python代码实现。算法基本原理及python代码1、方法一:三个指针遍历反转算法思想:使用3个指针遍历单链表,逐个链接点进行反转。(1)分别...

weixin_39622138的博客 322

python 反转链表并输出_动画:面试如何轻松反转链表?

题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。例如:问题分析反转链表,首先想到的是让最后一个结点作为头结点,第一个结点作为尾结点指向 null。如果我们把指针反方向改变,就可以轻松完成整个链表的反转。说到改变指针,我们有两个方式,第一种是从前到后改变指针,第二种是从后往前改变指针。从前往后代表迭代方式,从后往前是递归的方式,这个不难理解,直接上动画。动画实现递归法迭代...

weixin_42522817的博客 312

【python面试题】链表反转

单链表反转【python实现】 单链表反转方法 头节点开始遍历 1. 用三个指针来解决链表反转,`cur`是现在的链表节点,`tmp`暂存`cur.next`,`new_head`指向之前的`cur` 2. 其中,`tmp`是保存之前的链条不能断的,很重要 尾节点开始递归 递归反转链表,递归:从尾节点指向上一级节点,上一级节点指向None,重复这个过程,直到递归结束 代码如下: class ...

simuLeo的博客 592
上一篇: 贝叶斯公式与全概率公式合并的理解
下一篇: python作图之plt.contour详解
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值