首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏前端小菜鸡yym

    双向链表6

    removeAt(position) 用途: 移除指定位置的元素 越界判断 首先,对于position做一下负数和大于链表长度的越界判断。

    51620编辑于 2023-01-12
  • 来自专栏Linux学习~

    《手撕链表题系列-6链表分割

    前言 本系列主要讲解链表的经典题 注:划重点!! 必考~ 链表分割 牛客链接:链表分割_牛客题霸_牛客网 (nowcoder.com) 题目描述: 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前 ,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 解题思路: 因为需要相对顺序不变,所以我们选择用尾插法 要将小的放在前面,打的放在后面,这里我们可以选择使用两个链表 一个链接小的结点,另一个链接大的结点,最后再将大的链表尾插到小的链表上 参考代码: *cur1=pHead,*cur2=longhead,*cur3=lesshead; while(cur1) { //根据节点数据大小决定接上的链表的位置

    29720编辑于 2022-11-30
  • 来自专栏绝活编程学习

    链表OJ题--6.链表分割

    6.链表分割 链表分割_牛客题霸_牛客网 (nowcoder.com) /* 解题思路 创建两个链表,分别存放小于x的节点和大于等于x的节点,分别进行尾插 */ class Partition { public NULL; struct ListNode* lessHead, *lessTail,*greaterHead, *greaterTail; //创建链表表头 greaterTail = greaterTail->next; } cur = cur->next; } //链接两个链表

    18800编辑于 2024-12-16
  • 来自专栏Deep learning进阶路

    2-6 链表逆序

    2-6 链表逆序 我只介绍两种常用方法吧,非递归方法 和 递归 方法 我觉得够用就行 1、非递归方法: 将第二个元素后面的元素依次插入到头结点后面, 最后再把原始第一个元素放到原始第二个元素后面,整个链表就能够反转了 这个方法对于带不带头结点的链表都适用: ①不带头结点 原始链表,其中第二个元素是 B A -> B-> C -> D -> E -> F -> null 先进入循环,不断的把B的后继元素往第一个元素后面插 ( list1_h ); 这样新的头指针list_2就是反转后的链表的头指针 ②带头结点 其实依然可以用上面的函数,只是, 对于带头结点的链表,直接向上面那样 把 头结点的地址作为参数传递进去 是不行的 所以我们改一下调用的那行代码,就可以拿来对带头结点的单链表 进行逆序操作了: list2->next = ReverseList_DG(list2->next) 上面这行代码,是把带头结点的单链表的下一个元素 (其实带头结点的单链表不看头结点就是 一个不带头结点的单链表) 然后把返回的 新的地址,又接入到 头结点的后面! 这样就可以在不改变原来头结点 地址 的情况下, 仅对数据部分进行逆序啦。

    95510发布于 2019-07-02
  • 来自专栏后端架构师

    6.单向链表正确实现方式

    文中涉及的代码可访问 GitHub:https://github.com/UniqueDong/algorithms.git 上一篇《链表导论心法》讲解了链表的理论知识以及链表操作的实现原理。 接口定义 首先我们定义链表的基本接口,为了显示出 B 格,我们模仿我们 Java 中的 List 接口定义。 看起来是不是很像骚包,接着我们再抽象一个抽象类,后续我们还会继续写双向链表,循环链表。 双向循环链表。把他们的共性放在抽象类中,将不同点延迟到子类实现。 所以我们在单向链表定义一个静态内部类表示 Node 节点。 构造方法分别将数据构建成 Node 节点,默认 next 指针是 null。

    47600发布于 2020-04-11
  • 来自专栏前端食堂

    链表+6道前端算法面试高频题解

    口味:虎皮凤爪 数组在上一篇的专栏,数组回炉重造+6道前端算法面试高频题解中我们进行了回顾和刷题。 链表 趁热打铁,我们来对比数组来学习链表。 可见链表对内存的要求降低了,但是随机访问的性能就没有数组好了,需要 O(n) 的时间复杂度。 下图中展示了单链表及单链表的添加和删除操作,其实链表操作的本质就是处理链表结点之间的指针。 了解了链表的基础知识后,马上开启我们愉快的刷题之旅,我整理了 6 道高频的 LeetCode 链表题及题解如下。 原题链接[6] 迭代 初始化哨兵节点 prev 为 null,及当前节点 curr 指向头节点。 leetcode-cn.com/problems/linked-list-cycle/solution/qian-duan-shi-tang-ti-jie-chao-hao-li-ji-md8m/ [6]

    54130发布于 2021-04-09
  • 来自专栏全栈开发那些事

    6-1 单链表逆转 (20分)

    本题要求实现一个函数,将给定的单链表逆转。 ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Reverse要返回被逆转后的链表。 List L ) //申请一个结点,依次使用头插法将L的各个结点使用头插法接在新申请的结点后面就行 { //最后返回head->Next刚好指向逆置后的链表

    35320编辑于 2023-02-27
  • 来自专栏苦逼的码农

    链表问题】打卡6:三种方法带你优雅判断回文链表

    【难度】 普通解法:士:★☆☆☆ 进阶解法:尉:★★☆☆ 【解答】 方法1 我们可以利用栈来做辅助,把链表的节点全部入栈,在一个一个出栈与链表进行对比,例如对于链表 1->2->3->2->2,入栈后如图 boolean f1(Node head) { 3 if (head == null || head.next == null) { 4 return true; 5 } 6 { 3 if(head == null || head.next == null) 4 return true; 5 Node slow = head;//慢指针 6 上道题我们有作过链表的反转的,没看过的可以看一下勒:【链表问题】如何优雅着反转单链表],我们可以把链表的后半部分进行反转,然后再用后半部分与前半部分进行比较就可以了。 { 3 if(head == null || head.next == null) 4 return true; 5 Node slow = head;//慢指针 6

    57530发布于 2018-12-25
  • 来自专栏用户3288143的专栏

    【剑指Offer】6. 从尾到头打印链表

    解题思路 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。 而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 rel.add(listNode.val); } return rel; } } 头插法 使用头插法可以得到一个逆序的链表 头结点和第一个节点的区别: 头结点是在头插法中使用的一个额外节点,这个节点不存储值; 第一个节点就是链表的第一个真正存储值的节点。 head = head.next; } return re; } } 使用栈 栈具有后进先出的特点,在遍历链表时将值按顺序放入栈中

    40520发布于 2020-12-07
  • 来自专栏Michael阿明学习之路

    剑指Offer - 面试题6. 从尾到头打印链表(栈,递归,反转链表

    题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com 2.3 反转链表 class Solution { vector<int> ans; public: vector<int> reversePrint(ListNode* head) { head = head->next; } return ans; } ListNode* reverseList(ListNode* head) { //反转链表

    37320发布于 2020-07-13
  • 来自专栏嵌入式学习

    链表——新建链表

    #include <stdio.h> #include <stdlib.h> #include <string.h> struct node { int data; struct node *pNext; }; //新建node struct node * create_node(int data) { struct node *p = (struct node *) malloc (sizeof(struct node)); if(NULL == p) {

    1.7K40发布于 2020-09-07
  • 来自专栏学习

    链表篇》---相交链表

    题目链接 相交链表 方法一:哈希集合 判断两个链表是否相交。使用哈希集合存储链表节点。 创建一个哈希Set集合。先将链表A中的节点放入这个集合中。 再遍历链表B。 pA 从链表 headA 的头部开始遍历,pB 从链表 headB 的头部开始遍历。 如果 pA 到达了链表 headA 的末尾(pA == null),就让它跳到链表 headB 的头部继续遍历。 当 pA 到达链表headA的末尾时,pA 被重置为链表headB的头部,这是为了让 pA 开始遍历链表headB。 类似地,当 pB 到达链表headB的末尾时,pB 被重置为链表headA的头部。 通过这种方式,两个指针在遍历完自己的链表后,会从对方的链表头开始遍历。 由于两个指针都会遍历两个链表的总长度,无论两个链表的长度是否相同,最终两个指针会在相交节点处相遇,或者同时到达链表的末尾(即没有相交节点的情况)。

    31810编辑于 2024-10-24
  • 来自专栏csdn-nagiY

    【Leetcode】反转链表 合并链表 相交链表 链表的回文结构

    ; 3.用n2遍历链表,n2为空时就跳出循环; 4.翻转链表,即n2->next=n1; 5.翻转下一个节点,即n1=n2;n2=n3;n3=n3->next; 6.注意:在n3=n3->next 【Leetcode21】合并两个有序链表 1.链接 合并两个有序链表 2.题目再现 3.三指针尾插法 思路:创建一个新的链表,分别遍历两个链表,小的就尾插到新链表,然后指针向后走一步,直到有一方为空时就结束循环 分表遍历两个链表,比较其值,小的尾插到新链表,并向后走一步(如果一样大,那么随便取哪一个都行); 4.结束循环后,判断哪个链表不为空,尾插到新链表。 【Leetcode160】相交链表 1.链接 相交链表 2.题目再现 3.解法 1.先分别遍历两个链表,记录下两个链表的长度; 2.如果两个链表尾节点的地址一样,则说明它们相交,否则不相交,(注意是地址不是值 ); 3.求出两个链表长度的差gap; 4.先让长的链表走差距步gap,短的链表先不动; 5.然后两个链表同时走一步,比较每走一步时两个链表当前节点的地址,如果一样,则说明找到了它们相交的起始位置

    41610编辑于 2024-01-23
  • 来自专栏韩曙亮的移动开发专栏

    【数据结构】线性表 ② ( 链式存储结构 - 链表 | 链表分类 - 单链表链表 非循环链表 循环链表 | 链表优缺点 )

    一、链式存储结构 - 链表 链式存储结构 就是 链表 LinkedList ; 链式存储结构 ( 链表 ) : 数据 存储在 节点 中 , 每个节点包含 数据值 和 指向下一个节点的指针 ; 通过节点之间的指针关系 Object data; // 指向下一个节点 Node next; // 指向上一个节点 Node last; } 二、链表分类 - 单链表 / 双链表 / 非循环链表 / 循环链表链表 与 双链表 : 单链表 : 上述链表是 单链表 , 单链表 只有一个指针 指向下一个节点 ; 双链表 : 还有一种链表是 双链表 , 双链表 有两个指针 , 一个指向下一个节点 , 一个指向上一个节点 ; 循环链表 : 如果 最后一个节点的指针 指向 第一个节点 , 那么这个链表就是循环链表 ; 链表可以分为以下四类 : 单链表 单循环链表链表 双循环链表 三、链表优缺点 链表 LinkedList 链表 LinkedList 缺点: 查询 性能低 : 如果要访问 链表中 指定位置的元素 , 需要从头节点开始遍历到目标位置 , 时间复杂度为O(n)。

    84640编辑于 2023-10-11
  • 来自专栏嵌入式项目开发

    C语言-链表(单向链表、双向链表)

    ,而且链表的空间是存储在堆上面的,可以动态分配,释放。 链表的每个节点就是一个结构体变量,节点里有一个或者两个指针,可以保存上一个节点和下一个节点的地址,方便遍历链表,删除、插入节点时定位位置。 2. 实现的功能如下: 初始化链表头 插入节点的函数(链表任意位置插入,链表尾插入) 删除节点的函数(链表任意位置删除、链表尾删除) 遍历链表,输出链表里的所有信息 #include <stdio.h> #include 找到链表尾 while(next_p! 找到链表尾 if(head!

    3.3K41编辑于 2022-01-07
  • 来自专栏P_M_P学习笔记

    Leetcode:相交链表,环形链表,环形链表||

    相交链表 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路: 先分别遍历两个链表,得出两个链表的节点个数和两个链表节点数的差,再创建两个指针指向两个链表,让节点数较多的链表的指针先遍历这个差值的节点数,然后两个指针再同时遍历,当两个指针指向的节点的地址相同时 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。

    47510编辑于 2024-01-20
  • 来自专栏P_M_P学习笔记

    【Leetcode】重排链表、旋转链表、反转链表||

    重排链表 题目描述 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1 提示: 链表的长度范围为 [1, 5 * 104] 1 <= node.val <= 1000 方法一: 将链表的每一个节点存在数组里,然后用下标访问的方式,交叉连接。 ,然后将中点后的链表翻转成一个新的链表,最后将这个新链表和原链表切割掉中间节点之后的链表合并成一个新的链表,合并方式是交叉合并。 题目描述 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

    37610编辑于 2024-01-19
  • 来自专栏学习

    链表篇》---反转链表

    题目链接 反转链表 方法一:迭代 循环从第二个节点开始。 首先判断若没节点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 设置反转链表的头结点。 假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?

    44310编辑于 2024-10-24
  • 来自专栏学习

    链表篇》---回文链表

    题目传送门 方法一:将值复制到数组中后用双指针法 思路: 1.将链表的值赋值到顺序表当中。 2.使用双指针法,判断顺序表中的值是否是回文。 left++; right--; } return true; } } 方法二:使用栈 思路: 1.先将链表中的值全部入栈 2.遍历链表,若链表元素与栈顶元素相等,则出栈。 3.栈最后为空,返回true。栈不为空返回false。 反转后半部分链表。 判断是否回文。 恢复链表。 返回结果。 isPalindrome(ListNode head) { if (head == null) { return true; } // 找到前半部分链表的尾节点并反转后半部分链表

    24810编辑于 2025-05-31
  • 来自专栏1996

    LeetCode每日一题-6:k个一组翻转链表

    题目描述: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 思路分析: 步骤分解: 链表分区为已翻转部分+待翻转部分+未翻转部分 每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定 需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来 初始需要两个变量 pre 和 end,pre 代表待翻转链表的前驱,end 代表待翻转链表的末尾 经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next 翻转链表,然后将三部分链表连接起来 pre指每次要翻转的链表的头结点的上一个节点。 ListNode start=pre.next; //翻转链表,pre.next指向翻转后的链表

    52520编辑于 2022-09-23
领券