【数据结构code】链表

rust 入门笔记:使用rust实现双向链表、二叉树 这是 os summer of code 2020 项目每日记录的一部分: github地址:https://github.com/yunwei37/os-summer-of-code-daily 双向链表 数据结构定义: use std::rc::Rc; use std::cell::RefCell; use std::clone::Clone; #[derive(Debug)] struct ListNode { value :i32, next: Option<Rc<Re 阅读详情

203.移除链表元素

1、题目:

https://leetcode.cn/problems/remove-linked-list-elements/

2、描述:

在这里插入图片描述

3、重点:

虚拟头节点的使用技巧

4、分析


# Definition for singly-linked list.单链表
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        # 创建虚拟头部节点以简化删除过程
        dummy_head = ListNode(next = head)
        
        # 遍历列表并删除值为val的节点
        current = dummy_head
        while current.next: # 最后一个节点的指针指向null,意味着已经遍历完了所有的节点
            if current.next.val == val:
                current.next = current.next.next
            else:
                current = current.next
        
        return dummy_head.next

707.设计链表

1、题目

https://leetcode.cn/problems/design-linked-list/

2、虚拟头节点的使用

重点:

  • 关注cur应该是dummy_head还是dummy_head.next
  • 关注遍历何时结束

代码实现:

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

class MyLinkedList(object):
    # 使用单链表方法
    def __init__(self):
        # 虚拟头节点
        self.dummy_head = ListNode()
        # 链表长度
        self.size = 0

    def get(self, index):
        """
        获取下表为index的节点的值
        :type index: int
        :rtype: int
        """
        # 首先判断index是否合法
        if index < 0 or index >= self.size:
            return -1

        # 定义临时指针
        cur = self.dummy_head.next # cur从头指针开始遍历
        for i in range(index):
            cur = cur.next

        return cur.val


    def addAtHead(self, val):
        """
        将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点
        :type val: int
        :rtype: None
        """
        ## 这里需要注意赋值顺序。
        # # 新建一个节点,next为head,即dummy.next
        # newnode = ListNode(val,next=self.dummy_head.next)
        # # 更改dummy.next
        # self.dummy_head.next = newnode

        # 也可以直接写为
        self.dummy_head.next = ListNode(val,self.dummy_head.next)
        self.size += 1


    def addAtTail(self, val):
        """
        将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
        :type val: int
        :rtype: None
        """
        # 新节点
        newnode = ListNode(val)
        # 临时指针
        cur = self.dummy_head
        # for i in range(size):
        #     cur = cur.next
        # 最后一个节点指向null,因此可以使用while
        while cur.next:
            cur = cur.next
        cur.next = newnode
        self.size += 1

    def addAtIndex(self, index, val):
        # 出错的地方!
        """
        将一个值为 val 的节点插入到链表中下标为 index 的节点之前。
        如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。
        如果 index 比长度更大,该节点将 不会插入 到链表中。
        :type index: int
        :type val: int
        :rtype: None
        """
        # 先判断index是否合法
        if index < 0 or index > self.size: # 这里为什么是大于,因为index可以为size,添加到尾部
            return
        # 临时指针
        cur = self.dummy_head
        for i in range(index):
            cur = cur.next
        
        cur.next = ListNode(val,cur.next)
        self.size += 1


    def deleteAtIndex(self, index):
        """
        如果下标有效,则删除链表中下标为 index 的节点
        :type index: int
        :rtype: None
        """
        # 先判断是否有效
        if index<0 or index >= self.size:
            return
        cur = self.dummy_head
        for i in range(index):
            cur = cur.next
        cur.next = cur.next.next
        # 注意增加或者删除时,size的变化
        self.size -= 1

# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)

206.反转链表

1、题目链接:

https://leetcode.cn/problems/reverse-linked-list/

2、重点

如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。

其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示:
在这里插入图片描述

3、分析

常考的题

共两种解法

  • 双指针法【先看懂这个】
  • 递归法【再理解这个】

循环内部定义了temp指针
这里要注意的是,赋值顺序:

  1. 要先将cur赋值给pre
  2. 再将temp赋值给cur
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
# 双指针法
class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        # 定义两个指针
        pre = None
        cur = head
        while cur:
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
        return pre

# 递归法
class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        return self.reverse(head,None)
    def reverse(self,cur,pre):
        if cur == None:
            return pre
        temp = cur.next
        cur.next = pre
        return self.reverse(temp,cur)

24. 两两交换链表中的节点

1、链接:

https://leetcode.cn/problems/swap-nodes-in-pairs/

2、描述

在这里插入图片描述

3、重点分析

  • 链表长度为奇数,则最后一个点不进行交换
  • 若为偶数,正好可以两两交换

交换时,链表头节点发生了变化,所以需要dummy_head

4、代码

方法一:
在交换前,需要保存一下1和3!!!

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
# 方法一 | 虚拟头节点
class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        dummyhead = ListNode(next=head) # 头节点
        cur = dummyhead
        while (cur.next!=None) and (cur.next.next!=None):
        # 这个while也可以写为:
        # while cur.next and cur.next.next:
            # 注意结束条件,考虑奇数和偶数情况,注意先后顺序
            temp = cur.next # 1
            temp1 = cur.next.next.next # 3
            cur.next = cur.next.next # cur->2
            cur.next.next = temp # 2->1
            cur.next.next.next = temp1 # 1->3 # 注意这里!不要犹豫
            cur = cur.next.next # cur移动2
        return dummyhead.next

方法二:递归,这里看的不是很懂

# 方法二 | 递归 不需要虚拟头节点
class Solution(object):

    def swapPairs(self, head):
        """
        两个指针进行两两交换
        :type head: ListNode
        :rtype: ListNode
        """
        if head is None or head.next is None: # 终止条件:链表没有节点,或者链表中只有一个节点
            return head
        # 待翻转的两个节点
        pre = head
        cur = head.next
        next1 = head.next.next
        # 交换
        cur.next = pre # 第二个指向第一个
        # 交换后,原链表的头节点变成新链表第二个节点,原链表的第二个节点变成新链表的头节点
        pre.next = self.swapPairs(next1)# 将以next为head的后续链表两两交换

        return cur

19.删除链表的倒数第N个节点

1、链接:

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

2、描述

在这里插入图片描述

3、重点分析

既然是倒数第n个点,可以使用双指针
快指针先走n+1步,然后快慢指针同时走。
当快指针走到null时,慢指针的next便是需要删除的

  • 删除节点需要前驱
  • 倒数第n个节点可能是头节点,需要dummy_head

4、代码

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        # 需要设置虚拟头节点,考虑要删除的点是头节点的情况 | 第一个错误点,没有考虑到头节点
        dummyhead = ListNode(next=head)
        fast,slow = dummyhead,dummyhead# 定义快慢指针
        n += 1
        for i in range(n): # 第二个错误点,fast移动n个点,用for循环,不是while
            fast = fast.next
        # while (n > 0) and fast:
        #     fast = fast.next # 快指针先走n+1步
        #     n -= 1
        while fast:# 快慢指针一起走,直到fast指向none
            fast = fast.next
            slow = slow.next
        slow.next = slow.next.next
        return dummyhead.next

面试题 02.07. 链表相交

1、链接:

简单题~
https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

2、描述

在这里插入图片描述

3、重点分析

4、代码

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        # 先求两个链表的长度
        n = 0
        m = 0
        curA = headA
        curB = headB
        while curA:
            curA = curA.next
            n += 1
        while curB:
            curB = curB.next
            m += 1
        if m > n:
            fast = headB
            slow = headA
        else:
            fast = headA
            slow = headB
        for i in range(abs((m-n))):
            fast = fast.next
        while fast != slow:
            fast = fast.next
            slow = slow.next
        return fast

142.环形链表II

1、链接:

https://leetcode.cn/problems/linked-list-cycle-ii/

2、描述

1、找到是否有环
2、去找环形的入口
在这里插入图片描述

3、重点分析

在这里插入图片描述

4、代码

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        # 先判断有没有环
        fast , slow = head , head
        while (fast != None) and (fast.next != None):
        # 可以写成:while fast and fast.next:
            fast = fast.next.next # 移动两步
            slow = slow.next # 移动一步
            if fast == slow:
                # 相遇 有环  -》寻找环的入口
                index1 = head
                index2 = fast
                while index1 != index2:
                    index1 = index1.next
                    index2 = index2.next
                return index1
        # 没有环
        return None
神经网络(十五)在VS Code下搭建PyTorch环境 pytorch在vscode中的配置和使用 阅读详情

相关推荐

TCMSP数据库+R语言实战:从网页爬虫到中药-靶点网络图的全流程解析

本文详细解析了如何使用R语言从TCMSP数据库抓取中药-靶点数据,并通过数据清洗、网络分析和可视化构建完整的中药作用机制研究流程。涵盖动态网页爬虫、ADME参数筛选、网络图构建及高级可视化技巧,为中医药现代化研究提供实用的生物信息学方法。

weixin_31304817的博客 336

谁还不得学学数据结构 leet code 206、92链表反转

# -*- coding: utf-8 -*- class Node(object): def __init__(self,val=None,next=None): self.val=val self.next=next class Link_list(object): def __init__(self): self.head=No...

weixin_43868376的博客 163

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7709

谁还不得学学数据结构 leet code.92反转链表

困在 if cur==None: #######困在这里了 pre.next=None break def remove_dup1(self): pre = self.head cur = pre.next ...

weixin_43868376的博客 213

从RRT到平滑轨迹:机械臂避障规划仿真全流程解析

本文详细解析了机械臂避障规划从RRT算法到平滑轨迹优化的全流程,包括MATLAB实现、碰撞检测工程实践及轨迹平滑优化技巧。通过RRT算法在关节空间的路径搜索与Minimum Jerk/Snap优化,实现机械臂在复杂环境中的高效安全运动,适用于工业自动化与机器人控制领域。

weixin_29051811的博客 293

InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用)

本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。

g9h0i1的博客 959

Rust Rosetta Code数据结构:链表、树和图在Rust中的优雅实现

Rust Rosetta Code项目提供了丰富的算法和数据结构实现,本文将深入探讨Rust中链表、树和图的优雅实现方式,帮助开发者掌握Rust内存安全和性能优化的核心优势。 ## 📚 数据结构在Rust中的独特魅力 Rust以其内存安全和零成本抽象著称,在数据结构实现方面展现出独特的优势。通过所有权系统和类型系统,Rust确保了数据结构操作的安全性和高效性,同时保持了代码的清晰可读性。

gitblog_00071的博客 520

颠覆性创新的测量框架与跨领域实证分析

颠覆性创新作为科技发展的重要驱动力,其核心在于实现知识体系的范式转换。从技术原理看,这类创新通常具备知识替代、网络重构和跨领域渗透三大特征,通过引用网络分析和文本挖掘等方法可量化评估其影响力。在工程实践中,CD指数、DI指数等测量工具帮助研究者识别具有突破潜力的成果,而深度学习等新兴技术进一步提升了评估精度。当前AI、半导体等领域的热门技术发展表明,模块化架构和产业协同能有效促进颠覆性创新。面对全球范围内创新颠覆性下降的趋势,优化科研评价体系、构建跨学科协作网络成为关键应对策略。

weixin_29735807的博客 321

学数据结构最好的工具VS Code 可视化debug以及可视化解决约瑟夫问题

学数据结构最好的工具VS Code 可视化debug 在VS Code拓展程序中搜索Debug Visualizer,找到上图所示的扩展程序并安装, 下方有可以创建的图表类型,但是需要强调的是输出必须为JSON格式的代码。 根据官方的提示可以编写许多种数据结构并且实现可视化,包括小编在内的正在学习数据结构的小朋友们可以享福啦!!! 小编以python循环链表为例(原谅我是个菜鸟的事实,写的代码又...

weixin_45877045的博客 2945

【FastDDS】Layer DDS之Subscriber ( 09-Accessing received data)

Fast DDS提供了多种接收数据访问方式:通过读取(read)或提取(take)操作获取数据,其中提取会移除数据而读取保留数据。应用程序可通过序列高效借用接收队列内存,但需及时归还。数据处理时需检查SampleInfo的有效性,可通过监听器回调或等待集机制异步获取数据。等待集允许线程专门等待新数据到达,通过条件触发和超时控制实现可靠的数据接收处理。

Ray Home 862

Cartographer实现双雷达建图

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 2 --执行一次前端匹配需要的激光扫描分段数量。关于num_subdivisions_per_laser_scan。num_laser_scans =2,--订阅激光扫描话题数量。Frame改为 前雷达laser_1 后雷达laser_2。雷达的话题由scan改为,前scan_1 后scan_2。有些人说需要改成2,但我这里改成2反而不行,1才可以。

Studying…… 1261

大话数据结构 code 第三章 03静态链表_StaticLinkList

大话数据结构 第三章 03静态链表_StaticLinkList

zjl-wgf 461

基于YOLOv11的手术器械计数系统:从数据集构建到Web应用部署

m2cai16-tool数据集:包含15种腹腔镜手术器械的标注图像Cholec80数据集:包含80个胆囊切除手术视频,标注了7种器械SurgicalTools数据集:包含超过10,000张手术器械图像,涵盖21类常见器械手术剪(Scissors)止血钳(Hemostat)持针器(Needle Holder)手术刀(Scalpel)镊子(Forceps)拉钩(Retractor)吸引器(Suction)

YOLO 394

VS Code调试可视化终极指南:高效调试数据结构的完整教程

调试是软件开发过程中不可或缺的环节,而**VS Code调试可视化工具**正是提升调试效率的强大助手。这款开源扩展能将复杂数据结构以直观图形方式呈现,帮助开发者快速理解程序运行状态,尤其适合处理链表、树、图表等抽象数据类型。本文将从安装配置到高级应用,全面讲解如何利用这款工具提升调试体验。 ## 为什么选择VS Code调试可视化工具? 传统调试器往往只能以文本形式展示变量,面对复杂数据结构时

gitblog_01061的博客 904

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

亚马逊云科技:深入探讨链表数据结构

单链表(每个节点仅拥有指向下一个节点的引用)、双链表(每个节点既有指向下一个节点的引用,亦有指向上一个节点的引用)和循环链表(最后一个节点指向第一个节点,可以高效地从尾部遍历至头部)。该视频演示了如何在代码中实现这些变体,包括插入、删除、遍历和排序等操作,同时强调了理解指针和引用的重要性。总的来说,这段视频强调了链表在编码面试中的重要性,以及作为队列、栈和哈希表等其他数据结构基础的地位。

weixin_46812959的博客 896

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

终极数据结构可视化指南:如何在VS Code中实时调试复杂数据

数据结构可视化是理解抽象编程概念的关键工具,而VS Code Debug Visualizer扩展则为开发者提供了将代码中的数据结构实时转化为直观图形的强大能力。本文将详细介绍这一工具如何帮助开发者突破传统调试的局限,通过动态图形界面观察数据变化,显著提升调试效率和代码理解能力。 ## 为什么数据结构可视化对开发者至关重要 🚀 在传统的调试过程中,开发者往往需要通过打印日志或查看变量值来推断

gitblog_00286的博客 411

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

终极指南:如何用 VS Code Debug Visualizer 让数据结构可视化?超实用调试技巧大公开!

想要在调试时直观地看到复杂的数据结构变化吗?VS Code Debug Visualizer 正是你需要的终极调试神器!🚀 这款强大的 VS Code 扩展能够将枯燥的调试数据转化为生动的可视化图表,让你在调试过程中一目了然地观察数据的变化过程。 ## 什么是 VS Code Debug Visualizer? VS Code Debug Visualizer 是一个革命性的调试可视化工具,

gitblog_00540的博客 1000

破局调试困境:vscode-debug-visualizer实现3D数据结构可视化革命

在软件开发过程中,调试复杂数据结构往往是最令人头疼的环节之一。传统调试工具只能显示变量的文本形式,开发者需要在脑海中构建数据模型,这不仅效率低下,还容易出错。**vscode-debug-visualizer** 作为一款强大的VS Code扩展,彻底改变了这一现状,它能将抽象的数据结构实时转化为直观的可视化图表,让开发者以视觉化方式洞察程序运行状态。 ## 核心功能:让数据结构"看得见" v

gitblog_00103的博客 377

终极指南:如何用VS Code Debug Visualizer实现数据可视化调试

VS Code Debug Visualizer是一款强大的VS Code扩展,它能在调试过程中将复杂数据结构以可视化方式呈现,帮助开发者更直观地理解程序运行状态。无论是数组排序、链表操作还是随机数据分布,这款工具都能将抽象的数据转化为清晰的图表,让调试过程不再枯燥。 ## 为什么选择VS Code Debug Visualizer? 传统调试往往依赖打印日志或查看变量值,这种方式对于复杂数据

gitblog_00976的博客 660

16.10.24

日食发了一个课件,叫 tgc think graphc code 流程结构 , 单层 循环结构 数据结构 链表 1.合并 链表 a 链表 b         2.删除链表中重复的元素 从第二个元素开始与前一个元素相相比较 转载于:https://www.cnblogs.com/amurzet/p/5998425.html...

weixin_30538029的博客 64

告别调试困境:vscode-debug-visualizer让数据结构一目了然

在软件开发过程中,调试是不可或缺的环节。传统调试工具往往只能以文本形式展示变量和数据结构,这对于复杂的数据结构(如链表、树、图等)来说,理解其状态和关系变得异常困难。vscode-debug-visualizer扩展应运而生,它能够在调试过程中可视化各种数据结构,帮助开发者更直观、高效地理解程序运行状态。本文将详细介绍如何选择和使用这款强大的调试可视化工具。 ## 核心功能与优势 vscode...

gitblog_01051的博客 957

突破调试瓶颈:vscode-debug-visualizer数据提取器让复杂数据结构一目了然

vscode-debug-visualizer是一款强大的VS Code扩展,它能够在调试过程中可视化数据,帮助开发者更直观地理解复杂数据结构,从而突破传统调试的瓶颈。无论是数组、链表还是图形数据,都能通过这款工具清晰呈现,让调试工作变得更加高效和简单。 ## 为什么选择vscode-debug-visualizer? 在日常的开发工作中,调试是不可或缺的环节。当面对复杂的数据结构时,传统的调

gitblog_00132的博客 1067

EF之Code First代码优先

1、前言Code First顾名思义,通告代码创建实体与数据库。示例中我们会创建表,分表是TUsers,TRoles、TUsersRoles。2、Code First实战示例打开VS2013,创建一个控制台引用程序,命名为MyCodeFirstDemo,如下图: 选中解决方案资源管理器中的项目,点击右键,选择”管理NuGet程序包” 搜索EntityFrameWrok,搜索到以后,点击安

高级项目经理、专注于技术架构、分享项目管理及职场心得 6581

终极指南:如何使用VS Code Debug Visualizer进行错误监控和实时调试

VS Code Debug Visualizer是一个强大的调试可视化扩展,能够将调试过程中的数据结构实时可视化,帮助开发者快速定位和解决生产环境中的问题。这个扩展通过丰富的可视化界面,让你在调试时能够直观地观察变量状态、数据结构变化和算法执行过程。 ## 🔍 为什么需要调试可视化扩展? 传统的调试方式往往只能通过查看变量值来理解程序状态,但对于复杂的数据结构如链表、树、图等,纯文本显示难以

gitblog_00810的博客 856

告别调试困境:10分钟掌握VS Code Debug Visualizer可视化调试技巧

你是否还在为调试时面对复杂数据结构而头疼?变量嵌套太深难以追踪?算法执行过程无法直观观察?VS Code Debug Visualizer(调试可视化工具)彻底解决这些问题,让数据以图形化方式呈现,调试效率提升10倍。本文将带你从安装到进阶,掌握可视化调试的核心技巧,读完你将能够:实时可视化链表/树/图表等数据结构、自定义可视化规则、跨语言调试支持,让抽象数据一目了然。 ## 核心价值与支持环境...

gitblog_00629的博客 759

终极指南:如何用VS Code Debug Visualizer实现无缝调试体验

VS Code Debug Visualizer是一款强大的VS Code扩展,能够在调试过程中可视化数据,帮助开发者更直观地理解代码运行状态和数据结构。无论是处理复杂的算法逻辑还是分析数据变化,这款工具都能提供实时、动态的可视化支持,让调试过程不再枯燥乏味。 ## 为什么选择VS Code Debug Visualizer? 传统的调试方式往往依赖于打印日志或查看变量值,这种方法对于简单的程

gitblog_01134的博客 428
上一篇: 【数据结构学习】链表
下一篇: 【数据结构学习】队列与栈
jc菜鸟教程
博客等级 码龄7年 49粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值