新闻详情

新闻详情

首页 / 资讯中心 / 详情

单链表核心操作全解析:带头结点、插入逆置与C/Python实现

发布时间:2026/9/30 11:48:37来源:尧图网络
单链表核心操作全解析:带头结点、插入逆置与C/Python实现
链表是所有学数据结构的人绕不过去的坎。你搜链表大概率是正在补作业、准备考研复试、或者刷LeetCode刷到怀疑人生。这玩意儿抽象、指针绕、边界条件多尤其是在指定位置插入建立单链表、不带头结点的单链表这类操作网上的教程各说各话照着抄还经常崩。我当年也在这上面栽过不少跟头这篇文章就直接把链表的基本操作、带头结点和不带头结点的区别、插入遍历逆置清空这些高频操作一次性讲透同时给出C语言和Python两套实现既适合零基础入门也适合考研复习和笔试突击。我自己带过团队也带过实习生发现很多人写链表代码报错根本原因不是语法不熟而是没在纸上画清楚指针到底指向哪。所以这篇不写空话直接从存储结构讲起每个操作结合代码和内存示意图拆解最后整理一份实操中高频踩坑排查清单。看完不说你能秒杀所有链表题但至少课本要求的单链表基本操作实验、编程题实训里的链表应用你都能独立写完并且调通。1. 链表到底是个什么东西——先搞懂它为什么存在1.1 从数组的痛点说起在讲链表之前我得先聊聊数组。数组在内存里是一段连续的空间就像电影院一排连在一起的座位。它的好处是天然支持随机访问——你要找第5个座位直接从入口数过去就行时间复杂度O(1)这是数组最亮眼的优势。但数组有两个让人头疼的问题。第一个问题是插入和删除很痛苦。假设一排座位坐满了人现在要让一个新同学坐在第3个位置那第3个位置之后的所有人都得往后退一位。这个操作的时间复杂度是O(n)数据量一大就非常难受。第二个问题是数组长度固定。你申请了10个座位想坐第11个人就没地方了。虽然C语言里可以用realloc动态扩容但扩容往往要搬运整片数据本质上还是在付出沉重代价。我经常跟朋友打这个比方数组是先买好停车位再停车链表则是车停哪儿算哪儿每辆车都记住下一辆车的地址。链表的每个节点在内存里是零散分布的不需要一整块连续空间靠指针把大家串起来。这样插入和删除只需要改指针指向不需要搬运其他数据时间复杂度降到O(1)——前提是你已经拿到了目标位置的指针。1.2 链表节点的内部结构与内存布局链表的节点在C语言里通常这样定义struct Node { int data; // 数据域存实际数据 struct Node* next; // 指针域存下一个节点的地址 };每个节点就干两件事存数据、记住下一个节点在哪儿。数据域可以是int、char、结构体甚至另一个链表指针域则是整个结构的纽带。在Python里同样的结构用类来表示class Node: def __init__(self, data): self.data data self.next None注意Python里没有指针的显式概念一切对象都是引用。你把一个Node对象赋给另一个节点的next属性本质上跟C语言的指针是同一回事——存的都是目标对象的地址只不过Python替你管理了这些细节。链表的“链”字精髓就在这个next指针上。一个节点顺着next往下走就能遍历整个链表。比如我要找到链表的第3个节点只能从头节点开始先走一步到第2个再走一步到第3个。这个过程叫指针后移时间复杂度是O(n)。所以链表牺牲了随机访问的能力换来了插入删除的灵活——天下没有免费的午餐。这里延伸出一个重要概念头指针和头节点。头指针是一个指针变量指向链表的第一个节点而头节点是在第一个数据节点之前额外附加的一个节点它本身不存有效数据只是为了操作方便。后面我会专门讲带头结点和不带头结点的区别这次先记住头指针是必须的没有头指针你就找不到整条链表的入口链表就丢了。2. 单链表的核心操作手把手拆解2.1 带头结点还是不带头结点这是个选择题我相信很多初学者看到带头结点的单链表和不带头结点的单链表这两个词就头大。到底加不加这个不存数据的头节点我用实际体验告诉你绝大多数情况下带头结点会让你少写一堆if判断代码的健壮性也更高。我们来对比一下在链表头部插入新节点这个操作。不带头结点时插入的代码长这样void insertAtHead(Node** head, int data) { Node* newNode (Node*)malloc(sizeof(Node)); newNode-data data; newNode-next *head; // 新节点指向原来的头节点 *head newNode; // 更新头指针 }你注意到没有这里为什么传的是Node**因为你要修改头指针本身的值必须传头指针的地址。如果只传Node*函数内部修改的只是头指针的副本外面根本不知道——这就是经典的传值传址问题。带头结点时头节点永远存在头指针永远指向头节点所以头部插入操作变得统一起来void insertAtHead(Node* head, int data) { Node* newNode (Node*)malloc(sizeof(Node)); newNode-data data; newNode-next head-next; head-next newNode; }你不需要判断链表是否为空、不需要更新头指针因为头节点永远是链表的哨兵。在空链表中插入第一个元素时不带头结点要处理head NULL的情况带头结点的代码却原封不动就能跑——这就是头节点的意义让空链表和非空链表的操作逻辑保持一致。我的建议是做单链表基本操作实验和实训题时除非题目明确要求不带头结点否则一律用带头结点的写法。它牺牲一个节点的内存换来的是逻辑大幅简化很划算。2.2 在指定位置插入节点的完整流程在指定位置插入建立单链表这个操作几乎出现在所有教材里也是考试最爱考的代码题。插入的核心逻辑其实就一句话找到目标位置的前驱节点然后让新节点先指向后继再让前驱指向新节点。为什么要先连后继再连前驱如果你先把前驱的next指向新节点那么原来位置上的后继节点就会丢失——你再也找不到它了这个顺序问题我见过无数人栽过包括我自己刚学的时候。假设我们要在第pos个位置插入新节点pos从1开始计数完整代码bool insertAtPos(Node* head, int pos, int data) { // 带头结点的情况head是头指针 Node* p head; int i 0; // 移动到第pos-1个节点即目标位置的前驱 while (p ! NULL i pos - 1) { p p-next; i; } if (p NULL) { printf(插入位置无效\n); return false; } Node* newNode (Node*)malloc(sizeof(Node)); newNode-data data; newNode-next p-next; // 第一步新节点指向后继 p-next newNode; // 第二步前驱指向新节点 return true; }这段代码的关键在于边界条件如果pos 1相当于头部插入此时p还指向头节点第二步会把新节点插到头节点之后。因为带头结点头节点永远是第0个位置的占位符所以pos1时自然走到正确逻辑不需要单独判断。如果pos大于链表长度加1p会在走到目标位置前变成NULL循环退出后判断p NULL就返回失败。如果链表本身就是空的只有头节点只要pos1p headp-next是NULLnewNode-next NULLhead-next newNode依然正确。再看一下插入时空链表的特殊情况。很多人觉得空链表插入要特殊处理带头结点后完全不需要。这就是我前面说的头节点把链表是否为空这个差异抹平了。2.3 遍历、清空、逆置这些高频操作怎么写遍历是链表最基本的操作。思路很简单从头开始每访问一个节点就输出它的数据然后让指针后移直到指针为NULL。void traverseList(Node* head) { Node* p head-next; // 带头结点时从第一个数据节点开始 while (p ! NULL) { printf(%d , p-data); p p-next; } printf(\n); }这里有一个需要提醒的细节遍历时绝对不能用p来代替p p-next。这不是数组链表节点在内存中不是连续的p只会让指针跳到下一个内存地址跳到的可能是完全无关的内存区域访问它就会导致未定义行为。这是很多从数组思维切换过来的人犯的第一个错误。清空链表和销毁链表也容易混。清空是指释放所有数据节点但保留头节点这样链表还能继续使用销毁则是把包括头节点在内的所有节点全部释放链表彻底不复存在。// 清空链表保留头节点 void clearList(Node* head) { Node* p head-next; Node* temp; while (p ! NULL) { temp p-next; free(p); p temp; } head-next NULL; }注意这里必须先保存p-next再free(p)。如果你先free(p)p指向的内存已经释放再访问p-next就是读取悬空指针的非法操作这在C语言里是极其危险的事轻则运行时崩溃重则产生难以排查的内存错误。逆置链表是另一个高频考点。简单说就是把链表从头到尾倒过来原来第一个节点变成最后一个最后一个变成第一个。我见过三种主流方法迭代三指针法、头插法、递归法。迭代三指针法的核心思路是准备三个指针prev、curr、next遍历链表时逐个把当前节点的next指向前一个节点。Node* reverseList(Node* head) { Node* prev NULL; Node* curr head-next; // 从第一个数据节点开始 Node* next; while (curr ! NULL) { next curr-next; // 先保存后继 curr-next prev; // 指针反转 prev curr; // prev前移 curr next; // curr前移 } head-next prev; // 头节点指向原来的尾节点 return head; }这个方法一定要在纸上画图走一遍才能真懂。我个人经验是画图时用三个不同颜色的笔分别标prev、curr、next每走一步就画一个状态画三轮之后就再也不会忘了。Python版的两种写法我都给你# 迭代法 def reverse_list(head): prev None curr head while curr: next_node curr.next curr.next prev prev curr curr next_node return prev# 递归法面试常问 def reverse_list_recursive(head): if head is None or head.next is None: return head new_head reverse_list_recursive(head.next) head.next.next head head.next None return new_head递归法的关键是理解head.next.next head这句话的含义假设目前的head是倒数第二个节点那么head.next就是最后一个节点把最后一个节点的next指向自己就把方向倒过来了。之后再把head.next置空防止形成环。这个写法很优雅但链表很长时有栈溢出的风险实践中还是迭代法更稳。3. 两种必须掌握的进阶形态循环单链表与双链表3.1 循环单链表尾节点不再指向NULL普通的单链表走到最后一个节点时next为NULL走到头就停下来了。循环单链表则不同最后一个节点的next指向头节点或者第一个数据节点具体看你咋约定形成一个环。从任意一个节点出发都能绕一圈回到自己。这个结构为什么有用最经典的例子是约瑟夫环问题。一群人围成一圈报数报到某个数的人出列然后从下一个人重新开始报数直到最后剩下一个人。这个问题如果用普通单链表做每轮都要从头开始找起点用循环链表做天然就是一圈的结构顺着走就行逻辑直白得多。另一个常见应用是操作系统进程调度里的就绪队列、时间片轮转调度进程排成一个环每次执行一个时间片后CPU指针移到下一个节点就这么一直转下去。循环单链表基本操作的代码其实只改了两个地方建立时的指针指向尾节点不再next NULL而是next head。遍历结束条件从p ! NULL变成p ! head判断是否绕了一圈回到起点。// 带头节点的循环单链表遍历 void traverseCircularList(Node* head) { if (head-next head) { // 空循环链表 printf(空链表\n); return; } Node* p head-next; while (p ! head) { // 回到头节点就说明遍历完了 printf(%d , p-data); p p-next; } printf(\n); }循环链表最要小心的坑就是死循环。普通链表遍历到NULL就停了循环链表万一结束条件写错程序会一遍遍绕圈CPU直接飙到100%而且你还不容易察觉。写循环链表代码时建议在遍历函数里加一个计数器万一超过链表长度就主动报错这在调试阶段能帮你省下大量时间。3.2 双链表能往前走的底气单链表只能往后走想找前一个节点就得从头再遍历一次效率很低。双链表给每个节点加了prev指针指向它的前驱节点。struct DNode { int data; struct DNode* prev; struct DNode* next; };双链表最大的优势是双向遍历和删除当前节点不需要找前驱。在单链表里删除一个节点你得先找到它的前驱节点然后让前驱的next指向当前节点的后继在双链表里当前节点的prev就是前驱所以可以直接操作。双链表删除当前节点的代码void deleteNode(struct DNode* p) { p-prev-next p-next; p-next-prev p-prev; free(p); }两行核心代码干净利落。不过要注意边界条件如果p是第一个节点p-prev可能是NULL或者头节点你仍然可以操作p-prev-next但如果p是唯一数据节点且没有头节点p-prev是NULL直接访问p-prev-next就是空指针崩溃。所以双链表通常也带头节点头节点承担了所有边界情况的缓冲。双链表的插入会稍微复杂一点因为要维护两个指针// 在p节点之后插入s节点 void insertAfter(struct DNode* p, struct DNode* s) { s-next p-next; s-prev p; p-next-prev s; // 或 p-next-prev s 与上一行需保证p-next存在 p-next s; }我当年经常搞混这四行代码的顺序后来总结了一个口诀先处理新节点的两条新链再处理老邻居的指向。具体来说先让s的next等于p当前的next让s的prev等于p然后让p原来的后继p-next的prev指向s最后让p的next指向s。这个顺序保证了在任何一步操作后都不会丢失任何一个节点的引用。4. 用C语言和Python各写一遍语法细节全对比4.1 C语言结构体链表的基本语法与内存管理C语言的链表核心就是结构体加指针。前面已经定义了Node结构体现在看一个完整的建链、插入、遍历示例。#include stdio.h #include stdlib.h struct Node { int data; struct Node* next; }; // 创建带头节点的链表 struct Node* createList() { struct Node* head (struct Node*)malloc(sizeof(struct Node)); head-next NULL; return head; } // 尾插法建立单链表 void append(struct Node* head, int data) { struct Node* p head; while (p-next ! NULL) { p p-next; } struct Node* newNode (struct Node*)malloc(sizeof(struct Node)); newNode-data data; newNode-next NULL; p-next newNode; } int main() { struct Node* head createList(); for (int i 1; i 5; i) { append(head, i * 10); } // 遍历输出 struct Node* p head-next; while (p ! NULL) { printf(%d , p-data); p p-next; } printf(\n); return 0; }这里有三个必须在实操中记住的教训第一malloc之后必须检查返回值。虽然现在的开发环境内存一般够用但嵌入式环境、内存紧张的场景下malloc可能返回NULL不检查就直接用程序会在运行时崩溃而且难以定位。正确的习惯是struct Node* newNode (struct Node*)malloc(sizeof(struct Node)); if (newNode NULL) { printf(内存分配失败\n); return; }第二C语言开发中务必配套使用free。一个链表操作中malloc了多少次最终就要free多少次否则就是内存泄漏。写算法题可能无所谓但做实际项目内存泄漏积累到一定程度程序会莫名变卡、变慢。第三结构体链表传参时注意函数参数类型的选择。不需要修改头指针本身就传struct Node* head需要修改头指针的值比如不带头结点时的头插就必须传struct Node** head。这个二级指针问题是C语言链表面试最常挖的坑没有之一。4.2 Python实现链表和逆序操作Python里没有指针、没有malloc链表代码看起来清爽很多但底层逻辑和C语言完全一样。Python的链表节点用类或namedtuple定义都可以我习惯用类因为可读性好、能挂方法。class ListNode: def __init__(self, value0, nextNone): self.value value self.next next def create_linked_list(values): 根据列表创建链表返回头节点 dummy ListNode() # 相当于带头节点的头 curr dummy for val in values: curr.next ListNode(val) curr curr.next return dummy.next def traverse(head): while head: print(head.value, end ) head head.next print()这个dummy节点的用法其实就是C语言里头的头节点很多用Python写链表的人忽略了这一点导致在空链表上插入时写一堆特判。用dummy后插入逻辑统一了。逆序操作我们前面给过迭代和递归两种写法这里补充一个很多面试官喜欢的变种需求——按区间逆置比如把链表的第m个到第n个节点逆置。这种题在LeetCode上是中等难度核心思路是拆解成定位前驱 区间内逆置 接回原链表。按区间逆置的Python实现def reverse_between(head, m, n): dummy ListNode(0, head) prev dummy for _ in range(m - 1): prev prev.next curr prev.next for _ in range(n - m): next_node curr.next curr.next next_node.next next_node.next prev.next prev.next next_node return dummy.next这个写法可以理解为头插法的区间化每次把curr的下一个节点摘下来头插到区间开头的位置重复n-m次区间就整体逆置了。我第一次看这个代码时很懵后来自己在纸上画了三个节点逐步演示才真正想明白中间那句prev.next next_node是在干什么——它不断更新区间开头的锚点让最新的头插节点永远排在前面。5. 链表实操中的常见问题与排查技巧实录5.1 悬空指针与内存泄漏C语言链表的头号杀手链表实操中99%的崩溃和诡异bug都浓缩成一句话访问了已经释放的内存或者忘了释放不再使用的内存。前者叫悬空指针后者叫内存泄漏。举个最典型的悬空指针例子Node* p head-next; // p指向第一个数据节点 free(p); // 释放p指向的内存 p-data 100; // 危险p变成悬空指针写入无效内存free之后p指向的内存已经还给操作系统了但p这个指针变量还保留着那个地址的值。你再通过p访问这块内存就属于未定义行为——它在你的机器上可能正常运行一万次却在最关键的一次悄悄出错。我排查悬空指针的方法是每次free之后立刻把指针置为NULL养成习惯。后续代码再用到这个指针时一判断NULL就能发现问题出在哪个环节。不要小看这个习惯它帮我省过无数次调试时间。内存泄漏则更隐蔽。删除链表节点时只改了指针关系、没有free或者函数内部malloc了节点但函数结束时没把指针传出来——这些都会造成泄漏。排查内存泄漏的C语言手段我推荐valgrind它是Linux下的内存调试神器valgrind --leak-checkfull ./your_program它会明确告诉你哪一行malloc的内存没有对应的free。虽然不是所有作业环境都能装valgrind但你只要在本地学会使用写链表代码的正确率会提高一个量级。5.2 Python链表常见的坑循环引用与可变对象Python链表虽然不用手动管理内存但也有它的坑。第一个坑是循环引用。在双链表或者循环链表中节点之间互相引用如果忘记断开引用垃圾回收器可能无法及时回收这些节点造成内存占用持续上升。解决方法是删除节点时显式把prev和next置为None打破循环引用链。第二个坑是可变对象的引用共享。如果一个链表的data域放的是列表或字典这种可变对象多个节点的data可能指向同一个对象修改一个节点就会影响其他节点。这个不是链表本身的问题但对新手来说排查起来非常迷惑。第三个坑是递归深度。有人用递归实现链表逆置或遍历链表长度只要超过Python默认的递归深度限制通常是1000层就会抛RecursionError。我见过一个同学用递归逆置5000个节点的链表直接栈溢出。遇到长链表一定用迭代法。5.3 边界条件速查表链表题一次过的核心心法做题和考试时链表题如果没考虑边界条件往往要反复改错很多次。我整理一份高频易漏的检查点操作必须检查的边界条件在头部插入/删除头指针是否正确更新不带头结点时特别关键在尾部插入/删除尾节点的next是否为NULL/是否指向头节点循环链表删除唯一节点链表是否会变为空链表头指针是否要更新在指定位置插入位置是否合法pos是否超出链表长度1逆置链表空链表、单节点链表是否正常工作清空链表是否释放了所有节点是否有节点残留双链表头部操作prev是否为NULL会不会导致空指针访问做题的时候我建议对大脑里的测试用例养成三个必测的习惯空链表、单节点链表、正常多节点链表。这三个用例过了边界条件基本没有问题。这是一个刷题量超过1000道之后总结出来的经验直到今天我写链表代码仍然会默念这三条。5.4 编译报错的常见误区C语言链表编译报错的几个常见原因我也顺手整理一下第一结构体定义末尾忘了分号。struct Node { int data; struct Node* next; };很多人写到最后忘了那个分号编译器报的错误还不一定指向这一行非常绕。第二结构体内部自引用的问题。在结构体里声明struct Node* next是合法的因为指针的大小在编译期是确定的。但你不能在结构体里直接声明struct Node next那会导致无穷递归定义编译器直接报错。第三头文件的包含顺序问题。如果多个链表函数分散在多个文件里struct Node的定义要放在一个公共头文件里用#ifndef防止重复包含否则会报重定义错误。我自己的习惯是C语言链表代码先在单个.c文件里全部写完跑通再考虑模块化拆分。一上来就拆文件对新手来说只会增加排错难度。6. 链表的实际应用场景与扩展思路链表的应用比很多人想象的更广泛。单靠数组走遍天下的时代早就过去了工程中链表的影子随处可见。第一个是文件系统的分配表。FAT文件系统里每个目录项和数据块之间就是链表关系。你读取一个文件的内容系统会顺着一个个块链往下找块与块不连续也没关系链会帮你串联起来。第二个是浏览器和编辑器的撤销操作。很多编辑器的undo/redo用双链表实现每一次操作是一个节点prev指向上一个状态、next指向下一个状态。你按CtrlZ往后退就是顺着prev移动重做就是顺着next移动。这个应用场景非常适合你理解为什么双链表能往前走如此重要。第三个是哈希表的链地址法。当哈希冲突发生时常见的解决办法是在哈希桶bucket里拉出一条链表所有映射到同一个桶的数据串在一条链上。Java的HashMap在链表过长时还会转成红黑树本质就是为了解决链表查找效率低的弊端。说这些不是让你背概念而是帮你建立数据结构是为解决实际问题而生的认知。链表的最核心优势永远是插入删除高效、大小动态灵活代价是随机访问慢、额外的指针存储开销。你可以用这个标准去判断任何场景是否适合用链表需要频繁在中间插入、删除优先考虑链表。经常需要按索引访问第n个元素放弃链表改用数组或动态数组。数据量小且变化不频繁用数组更简单链表反而让你写更多代码。最后一个实操经验关于链表的学习路径。不要上来就刷LeetCode的链表题先花半天时间把单链表基本的建、插、删、查、逆全部用C和Python各写一遍确保不查资料就能手写。这个过程就像学游泳先在水里扑腾只有亲手调通过内存崩溃的代码才能真正理解指针。基础操作熟透之后再去做循环链表、双链表、链表的排序合并这些进阶题会顺畅很多。根据我个人经验链表这道坎卡住过无数人但它恰恰是最值得花时间啃的一块硬骨头。你把链表彻底搞懂后续学习二叉树、图、哈希表都会轻松很多因为它们本质上都在和节点引用这两个概念打交道。画图、手写、调错、再画图这个循环重复上几轮你就再也不会惧怕链表了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SpringBoot动漫分享系统实战:从数据库设计到Docker部署 2026/9/30 12:27:18

SpringBoot动漫分享系统实战:从数据库设计到Docker部署

1. 项目背景与定位:为什么要做“动漫分享系统”说实话,每年毕业季我都会看到大量“基于SpringBoot的XX管理系统”选题,动漫分享系统算其中比较有代表性的一个。它不是简单的CRUD堆砌,而是把用户、内容、评论、收藏、文件上传、视频…

阅读更多 →
Agent Skills安全实践清单:DefaultAzureCredential认证、防密钥泄露与智能体安全配置 2026/9/30 12:27:04

Agent Skills安全实践清单:DefaultAzureCredential认证、防密钥泄露与智能体安全配置

Agent Skills安全实践清单:DefaultAzureCredential认证、防密钥泄露与智能体安全配置 【免费下载链接】skills Skills, MCP servers, Custom Agents, Agents.md for SDKs to ground Coding Agents 项目地址: https://gitcode.com/gh_mirrors/agent/skills Ag…

阅读更多 →
FDE落地:FDE不断落地,82亿美元,AMD全股票收购李飞飞的World Labs 2026/9/30 12:26:57

FDE落地:FDE不断落地,82亿美元,AMD全股票收购李飞飞的World Labs

82亿美元,AMD全股票收购李飞飞的World Labs。 从2024年初创办到2026年中签署收购协议,空间智能公司World Labs练习时长一坤年。 交割完成后,李飞飞将加入AMD担任执行副总裁兼首席科学家,直接向董事长兼CEO苏姿丰汇报。 联合创始人…

阅读更多 →
Unity粒子系统底层原理与URP跨平台优化指南 2026/9/30 12:26:50

Unity粒子系统底层原理与URP跨平台优化指南

1. 为什么“粒子效果”不是特效的终点,而是你理解Unity渲染管线的起点“【实现100个unity特效之7】unity 3d实现各种粒子效果”——这个标题乍看是教程合集里平平无奇的一节,但如果你真把它当成“拖几个预设、调几个滑块就能交差”的任务,那接…

阅读更多 →
华为全栈智能数据中心解决方案:架构分层与落地实践指南 2026/9/30 12:26:50

华为全栈智能数据中心解决方案:架构分层与落地实践指南

简介:这份PDF文档聚焦华为全栈智能数据中心解决方案,面向金融、电信、政府等行业中负责数据中心规划、建设与运维的架构师、IT管理者及数字化转型决策者,帮助其理解如何借助全栈智能技术降低TCO、提升业务效率。资源包内仅含1个PDF文件&#…

阅读更多 →
字符串数组实战指南:从初始化到内存布局与分割查找 2026/9/30 12:26:50

字符串数组实战指南:从初始化到内存布局与分割查找

你说得对,上一篇把字符数组和字符串数组的基础概念过了一遍,评论区很多朋友说“看懂了,但是一上手写代码就被字符串搞到头大”。这期我不打算重复基础定义,直接把平时实际项目中遇到的高频问题拎出来讲:初始化那些看似…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉