与之前链表不同,这里的链表可以适合不同的数据类型存储 插入也有两种写法 写法1:注意curNode指针的移动位置,不要让他在等于curNode=NULL后还要插入数据 ? 写法2: ?...struct LList { LinkNode pHeader;//头节点结构体 int size;//链表长度 }; //取个别名 typedef void* LinkList; //链表的初始化...init_LinkList() { LList *llist=(LList*)malloc(sizeof(LList)); if (llist == NULL) { return NULL; } //头节点初始化...struct LList { LinkNode pHeader;//头节点结构体 int size;//链表长度 }; //取个别名 typedef void* LinkList; //链表的初始化...init_LinkList() { LList *llist=(LList*)malloc(sizeof(LList)); if (llist == NULL) { return NULL; } //头节点初始化
有头链表 无头链表: #define _CRT_SECURE_NO_WARNINGS #include #include typedef struct...LinkNode { int num; LinkNode* next; }Lk, * lk; //有头链表的初始化 lk initLinkNode() { //创建头结点 lk headNode...= (lk)malloc(sizeof(Lk)); //检验头结点分配内存是否成功 if (headNode == NULL) { return NULL; } //初始化头结点...方便插入新的数据 lk currentNode = headNode; //让用户输入几个数,如果输入-1,结束输入 int val = -1; while (1) { printf("请给当前链表赋值...void for_each_linkList(lk headNode) { if (headNode == NULL) { return; } //利用一个记录当前节点的指针,来遍历输出整个链表
这样做是为了初始化一个指针变量,可以在后续的操作中用来指向链表的某个节点。 2.应用场景: 第一行代码通常用于创建新的节点或对象,例如在链表中插入新节点时,需要动态地分配内存空间来存储新节点的数据。...3.举例说明--链表 在C语言链表中,需要初始化一个指针变量的情况有两种: 创建链表时,需要初始化一个指向链表头节点的指针变量。 这样可以方便地遍历链表和操作链表。...例如: struct Node { int data; struct Node* next; }; struct Node* head = NULL; // 初始化指向链表头节点的指针变量...遍历链表时,需要初始化一个指向当前节点的指针变量。...例如: struct Node* temp = head; // 初始化指向当前节点的指针变量 while (temp !
提示:文章参考王道的课程,相当于课程笔记 目录 一、单链表的定义及初始化 1、定义 2、初始化 1)不带头结点的单链表 2)带头节的单链表 二、单链表插入和删除 1)插入 1、按位序插入...---- 一、单链表的定义及初始化 首先介绍一个关键字typedef ——数据类型重命名 typedef typedef struct LNode LNode 1、... //声明一个指向单链表的第一个结点的指针 (强调这是一个单链表LinkList) 2、初始化 1)不带头结点的单链表 bool InitList(LinkList &L) //初始化空链表...: 初始化单链表长度 /* while 循环{ 每次取一个数据元素e ListInsert(L,length+1,e) ; length++; } 时间复杂度:O(n2) */...InitList(L);//初始化一个空表 List_TailInsert(L); return 0; } 六、补充求单链表长度 //求单链表的长度 int Length (LinkList
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { in...
【Leetcode21】合并两个有序链表 1.链接 合并两个有序链表 2.题目再现 3.三指针尾插法 思路:创建一个新的链表,分别遍历两个链表,小的就尾插到新链表,然后指针向后走一步,直到有一方为空时就结束循环...;结束循环后,判断哪个链表不为空,把不为空的尾插到新链表中去。...分表遍历两个链表,比较其值,小的尾插到新链表,并向后走一步(如果一样大,那么随便取哪一个都行); 4.结束循环后,判断哪个链表不为空,尾插到新链表。...【Leetcode160】相交链表 1.链接 相交链表 2.题目再现 3.解法 1.先分别遍历两个链表,记录下两个链表的长度; 2.如果两个链表尾节点的地址一样,则说明它们相交,否则不相交,(注意是地址不是值...); 3.求出两个链表长度的差gap; 4.先让长的链表走差距步gap,短的链表先不动; 5.然后两个链表同时走一步,比较每走一步时两个链表当前节点的地址,如果一样,则说明找到了它们相交的起始位置
题目链接 相交链表 方法一:哈希集合 判断两个链表是否相交。使用哈希集合存储链表节点。 创建一个哈希Set集合。先将链表A中的节点放入这个集合中。 再遍历链表B。...pA 从链表 headA 的头部开始遍历,pB 从链表 headB 的头部开始遍历。 如果 pA 到达了链表 headA 的末尾(pA == null),就让它跳到链表 headB 的头部继续遍历。...当 pA 到达链表headA的末尾时,pA 被重置为链表headB的头部,这是为了让 pA 开始遍历链表headB。...类似地,当 pB 到达链表headB的末尾时,pB 被重置为链表headA的头部。 通过这种方式,两个指针在遍历完自己的链表后,会从对方的链表头开始遍历。...由于两个指针都会遍历两个链表的总长度,无论两个链表的长度是否相同,最终两个指针会在相交节点处相遇,或者同时到达链表的末尾(即没有相交节点的情况)。
一、链式存储结构 - 链表 链式存储结构 就是 链表 LinkedList ; 链式存储结构 ( 链表 ) : 数据 存储在 节点 中 , 每个节点包含 数据值 和 指向下一个节点的指针 ; 通过节点之间的指针关系...Object data; // 指向下一个节点 Node next; // 指向上一个节点 Node last; } 二、链表分类 - 单链表 / 双链表 / 非循环链表 / 循环链表 单链表...与 双链表 : 单链表 : 上述链表是 单链表 , 单链表 只有一个指针 指向下一个节点 ; 双链表 : 还有一种链表是 双链表 , 双链表 有两个指针 , 一个指向下一个节点 , 一个指向上一个节点...; 循环链表 : 如果 最后一个节点的指针 指向 第一个节点 , 那么这个链表就是循环链表 ; 链表可以分为以下四类 : 单链表 单循环链表 双链表 双循环链表 三、链表优缺点 链表 LinkedList...链表 LinkedList 缺点: 查询 性能低 : 如果要访问 链表中 指定位置的元素 , 需要从头节点开始遍历到目标位置 , 时间复杂度为O(n)。
相交链表 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。...思路: 先分别遍历两个链表,得出两个链表的节点个数和两个链表节点数的差,再创建两个指针指向两个链表,让节点数较多的链表的指针先遍历这个差值的节点数,然后两个指针再同时遍历,当两个指针指向的节点的地址相同时...如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。...如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。...为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。
重排链表 题目描述 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1...提示: 链表的长度范围为 [1, 5 * 104] 1 <= node.val <= 1000 方法一: 将链表的每一个节点存在数组里,然后用下标访问的方式,交叉连接。...,然后将中点后的链表翻转成一个新的链表,最后将这个新链表和原链表切割掉中间节点之后的链表合并成一个新的链表,合并方式是交叉合并。...题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。...请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
实现的功能如下: 初始化链表头 插入节点的函数(链表任意位置插入,链表尾插入) 删除节点的函数(链表任意位置删除、链表尾删除) 遍历链表,输出链表里的所有信息 #include #include...初始化链表头 list_head=list_HeadInit(list_head); //2....初始化链表头 head->next=NULL; } return head; } /* 函数功能: 在链表尾插入数据 int a 插入的数据值 struct app...初始化链表头 list_head=list_HeadInit(list_head); //2....初始化链表*/ list_head=List_HeadInit(list_head); /*2.
题目链接 反转链表 方法一:迭代 循环从第二个节点开始。 首先判断若没节点head为null 或者 若只有一个节点。head.next = null。则返回head。...接下来 定义一个 cur 节点,指向链表的第二个节点。这个 cur 将用于遍历链表。 将当前 head 节点的 next 设为 null,因为它将成为反转链表的末尾节点。...之后 开始遍历链表并反转指针 1.ListNode curNext = cur.next; 保存cur.next的值,防止丢失。 2.cur.next = head 反转链表。...令cur.next指向前一个节点 3.head = cur 设置反转链表的头结点。...假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?
给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。...为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。...注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回 true 。 否则,返回 false 。 进阶: 你能用 O(1)(即,常量)内存解决此问题吗?...示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。...提示: 链表中节点的数目范围是 [0, 104] -105 <= Node.val <= 105 pos 为 -1 或者链表中的一个 有效索引 。
序 本文主要记录一下leetcode链表之反转链表 题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。...} return previous; } } 这里使用了current、previous、next来保存 小结 这里使用了current、previous、next来保存,初始化的时候
清空链表和销毁链表的区别: 清空链表:将所有除头节点以外的存放有数据的节点释放掉 销毁链表:将包括头结点在内的所有节点释放掉 注意:当清空所有有数据的节点,并且释放头结点后,该链表就无法再通过头结点创建...struct LinkNode { int num; LinkNode* next; }Lk, * lk; //有头链表的初始化 lk initLinkNode() { //创建头结点 lk...headNode = (lk)malloc(sizeof(Lk)); //检验头结点分配内存是否成功 if (headNode == NULL) { return NULL; } //初始化头结点...int num; LinkNode* next; }Lk, * lk; //有头链表的初始化 lk initLinkNode() { //创建头结点 lk headNode = (lk)malloc...(sizeof(Lk)); //检验头结点分配内存是否成功 if (headNode == NULL) { return NULL; } //初始化头结点 headNode->num
链表是一种简单的数据结构。由两部分构成,数值部分和指针部分。 前一部分用来存储数据,后一部分存放的是下一个数据的地址,用于指向下一个数据。形成一个链状的结构。...我们在包里新建一个类,在需要使用链表时,用此类创建链表对象即可。链表是由一个个节点构成的,我们建立一个节点类,目的是通过此类能够创建一个链表节点。然后就能以他为起点,插入其他的节点形成链,成为链表。...链表的一个节点需要具备以下要素: 值域 指针 构造函数 调用私有变量的函数 public class ListNode { private int val; private ListNode next...这样我们就可以在其他的类中建立链表对象了,像这样; ListNode firstNode = new ListNode(1); ListNode secondNode = new ListNode(2)...链表的插入操作 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141065.html原文链接:https://javaforall.cn
1 寻找单链表中点 + 链表反转 + 链表合并 这道题是道综合题,把三个知识点串起来,非常适合复习链表处理的三个技巧 【思路】:观察发现可以把链表后一半进行反转,然后当成两个链表的合并任务即可 class...head) return; // 1.寻找链表中点(快慢指针) auto premid = findmid(head); // 2.链表反转(pre/cur...auto l1 = head; auto l2 = premid->next; premid->next = nullptr; // 3.链表合并...(先保存next然后穿针引线) merge(l1, l2); } // 合并链表 void merge(ListNode* l1, ListNode* l2) {...while (l1 && l2) { // 先保存两个链表的next auto l1next = l1->next; auto l2next
1 题目描述 设计链表 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。...如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。...4 思路 这道题目设计链表的五个接口: 获取链表第index个节点的数值 在链表的最前面插入一个节点 在链表的最后面插入一个节点 在链表第index个节点前面插入一个节点 删除链表的第index个节点...可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目 链表操作的两种方式: 直接使用原来的链表来进行操作。...ListNode head; //初始化链表 public MyLinkedList() { size = 0; head = new ListNode
在分析链表之前,我们先来对之前的动态数组、栈、队列总结一下: (1)底层依托于静态数组 (2)依靠resize解决固定容量问题 ?...(3)是一种假的的动态数据结构 1.什么是链表 可以从以下两个部分来理解什么是链表 (1)最简单的动态数据结构,是一种真正的动态数据结构; (2)是一种数据的存储方式,数据存储在"节点"(Node)中...1.3 优点、缺点 优点:真正的动态,不需要处理固定容量的问题 缺点:丧失了随机访问的能力,也就是不能通过索引进行访问,只能next来进行查找 1.4数组与链表的对比 ? ...1.5 基本的链表节点结构代码: 新建一个package(LinkedList),然后新建一个类LinkedList,在该类中封装一个私有的节点,便于后续对于节点的使用。...,下一小节我们继续来学习如何如何在链表中添加元素。
不论在面试或者刷题过程中,很大概率都会遇到环形链表这种类型的题目,例如141. 环形链表 以及142. 环形链表 II等,本文主要介绍通过快慢指针法来解决此类题型,以供大家参考。...环形链表 环形链表大致样子如下图所示: image.png 快慢指针法 判断链表是否是环形链表,一般通过快慢指针法。...本题除了需要判断链表是否有环外,如果有环还要求入环的第一个节点,因此是上一个题目的升级版本,还是以快慢指针中举例的那个链表作为示例,下图将描述当链表有环的时候,如何求出入环的第一个节点,见下图示:...已判断链表有环 image.png 求入环的第一个节点 让慢指针重新指向链表的头节点,并让快慢指针同时每次只走一步 faster:5--->6--->7 slower:1--->2--->3 image.png...image.png 因此,由上面的图可知,当判断链表有环(快慢指针相遇)之后,再让快(或者慢)指针重新指向链表头节点,另外一个指针仍保持指向不变,然后让快/慢指针同时走,且每次只走一步,当他们再次相遇时
领取专属 10元无门槛券
手把手带您无忧上云