迭代 class Solution { public ListNode reverseList(ListNode head) { if (head == null) return head;...{ ListNode c = b.next; b.next = a; a = b; b = c; } return a; } } 递归
单链表是链表中的一种,本文描述OpenAtom OpenHarmony(以下简称“OpenHarmony”)中HDF软件模块自己定义的单链表,并学习其设计和实现方法。...迭代器简介迭代器是伴随集合概念产生的,意思是依次访问集合中的每一个元素,迭代器提供访问这些元素的方法。对于单链表而言,链表中的每一个节点都是一个元素,所有的节点组成集合。...通过迭代器,遍历元素变得简单直接(将遍历算法封装在迭代器中),不用每次迭代都考虑数据结构细节(数据结构种类繁多,单链表只是其中之一)。...直观上看,除了第一个节点,其它节点都可以通过next访问到,第一个节点通过root访问到。那实际上会不会就是这么简单呢?其实不然,因为需要考虑到节点删除的因素。...所以这个时候我们必须借助操作curr之前还在链表上的上一个节点,即上图的prev节点,通过其next成员,找到需要迭代处理的下一个节点。所以,迭代过程中需要记录prev、curr这2个节点的位置信息。
/** * 超级简单的数组加单链表实现Map * @author jlj * */ public class MyHashMap { public MyList[] lists
大家好,又见面了,我是你们的朋友全栈君。...1.初始化 //建立一个空的单链表 LinkList InitiateLinkList( )...malloc(sizeof(node)); //动态构建一个节点,它是头结点 head ->next = NULL; return head; } 2.求表长 //求单链表表...p = p->next; //指针移动到下一个节点 cnt ++; } return cnt; } 3.读表元素 //在单链表...=x) //访问链表 { i++; p = p->next; } if (p!
单链表实现: public class MyLinkedList { private static class Entry{ private E value;...iterator()的返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类中的对象。...此外,迭代器更是设计模式,如对图的遍历可以实现一个图迭代器,简化代码,将遍历的思想抽象出来。 自己实现一个可以遍历上述单链表的迭代器,这个迭代器需要实现Iterator接口中的方法。...主要包括以下三个方法: (1)是否存在下一个对象元素 (2)返回下一个对象元素 (3)删除集合中的当前迭代器指向的对象元素 public class MyLinkedList ...show()方法的功能是相同的,但是迭代器为遍历集合对象元素提供了一种统一的方法,此外也可以使用迭代器做更多的事情。
递归反转单链表已经明白了,递归反转单链表的一部分你知道怎么做吗?...一、反转链表Ⅱ 题目描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left 的链表节点,返回 反转后的链表 。...解题思路及代码 reverseN 递归反转链表的算法,具体的思路如下: 函数 reverseN 用于反转以 head 为起点的前 n 个节点,并返回反转后的新头结点。 ...将 head 的 next 指针指向记录的后驱节点 successor,保证反转后的链表与后面的节点连接起来。 返回新的头结点 last,作为上一层递归的结果。
https://blog.csdn.net/FE_dev/article/details/78821578 说明 这篇文章说JavaScript中的事件委托,这次先说一些比较基本的知识。...事件:JavaScript 侦测到的行为就是事件,比如鼠标点击、某个键盘的键被按下、元素获得焦点。 委托:就是把原来自己做的事,交给别人做。...,并不在生成的元素上绑定事件,而是在生成元素的父元素上绑定事件,因为父元素是一直存在的,所以绑定的事件就可以生效。...总结 这篇文章是比较基础的,还有一些东西没有说,比如文中说 事件委托的实现 的时候,举的例子比较简单,监听的 li 里面没有子元素,如果存在子元素时,那点击子元素 事件就不会触发,那怎么办呢?...还有 JQuery中的事件委托 又是怎么做的呢? 看这里 简单说 JavaScript中的事件委托(下)
题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?...prev; prev = cur; cur = next; } return prev; } }; 拓展 通过单链表的定义可以得知...,单链表也是递归结构,因此,也可以使用递归的方式来进行reverse操作。...由于单链表是线性的,使用递归方式将导致栈的使用也是线性的,当链表长度达到一定程度时,递归会导致爆栈,因此,现实中并不推荐使用递归方式来操作链表。...描述 除第一个节点外,递归将链表reverse 将第一个节点添加到已reverse的链表之后 这里需要注意的是,每次需要保存已经reverse的链表的头节点和尾节点 C++实现 // 普通递归 class
转载自labuladong的算法小抄,go语言描述 反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转单链表中的一部分,你是否能够递归实现呢?...如果你还不会递归地反转单链表也没关系,本文会从递归反转整个单链表开始拓展,只要你明白单链表的结构,相信你能够有所收获。...但是我们的递归解法不用一个 for 循环,纯递归实现反转。 迭代实现思路看起来虽然简单,但是细节问题很多的,反而不容易写对。相反,递归实现就很简洁优美,下面就由浅入深,先从反转整个单链表说起。...2、当链表递归反转之后,新的头结点是 last,而之前的 head 变成了最后一个节点,别忘了链表的末尾要指向 null: head.next = nil 理解了这两点后,我们就可以进一步深入了,接下来的问题其实都是在这个算法上的扩展...处理看起来比较困难的问题,可以尝试化整为零,把一些简单的解法进行修改,解决困难的问题。 值得一提的是,递归操作链表并不高效。
一、例子 1.png 上图中的二叉树的叶子结点,按从左到右的顺序连成的单链表如下图所示: 2.png 二、定义数据结构 typedef struct tree { int data; struct...tree *left; struct tree *right; }node, *pnode; pnode firstLeaf; // 记录叶子链表的第一个叶子结点 pnode pcur;...// 记录叶子链表的当前结点 三、核心算法 void leafLink(pnode root) { if(!...== root->right) { if(NULL == firstLeaf) { firstLeaf = root; // 保存找到的第一个叶子结点...(k指针) pcur = firstLeaf; } else { // 链接时用叶子结点的rchild域存放指针
可见链表对内存的要求降低了,但是随机访问的性能就没有数组好了,需要 O(n) 的时间复杂度。 下图中展示了单链表及单链表的添加和删除操作,其实链表操作的本质就是处理链表结点之间的指针。...链表的结点结构由数据域和指针域组成,在 JavaScript 中,以嵌套的对象形式实现。...,是我们遍历链表的起点 尾结点:尾结点的指针不是指向下一个结点,而是指向一个空地址 NULL 单链表:单链表是单向的,它的结点只有一个后继指针 next 指向后面的结点,尾结点指针指向空地址 循环链表:...回到本题的递归解法: 写递归解法的话,老套路,先明确终止条件,链表中没有节点或只有一个节点时无法进行交换。 接下来递归的进行两两交换节点并更新指针关系。 返回新链表的头节点 newHead。...开始迭代,记录 next 指针留备后用,反转指针。 推进指针继续迭代,最后返回新的链表头节点 prev。
2、 单链表逆序 第二个题目是很经典的“单链表逆序”问题。...如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示: ?...图(4)经过第三次迭代后的状态 此时可以看出,在图(4)的基础上再进行一次迭代就可以完成链表的逆序,因此循环迭代的终止条件就是当前的head指针是NULL。...= next; 循环终止条件是: head == NULL 根据以上分析结果,逆序单链表的循环算法如下所示: 61 LINK_NODE *ReverseLink(LINK_NODE *head)...()对问题进行求解,将链表分为当前表头节点和其余节点,递归的思想就是,先将当前的表头节点从链表中拆出来,然后对剩余的节点进行逆序,最后将当前的表头节点连接到新链表的尾部。
除了数据结构操作的可视化,还支持用 @visualize 标签 对递归算法进行可视化,大幅降低读者理解递归算法的难度。 下面就简单介绍一下可视化面板编辑器的使用方法。...操作内置数据结构 类似数组、哈希表等 JavaScript 内置的数据结构,就正常初始化和操作它们即可,比如: 需要着重讲的是 力扣/LeetCode 中一些特殊的数据结构,比如单链表ListNode和二叉树...操作单链表 首先说一下单链表,你可以用ListNode.create方法快速创建一条单链表,这是一个简单的例子: /** * Definition for singly-linked list....fib函数开启递归树可视化功能,每次递归调用会被可视化为递归树上的一个节点,函数参数中的n的值会显示在节点上。...2、@visualize注释必须写在函数定义的上一行,否则无法追踪递归过程。
单链表反转是一个经典的算法问题,考察对指针操作的理解。本文将详细解释单链表反转的原理。注意:均为Java语言实现 相关教程: 数据结构之链表详解 递归详解 1....其它方式 除了迭代方法,递归也是反转单链表的常用方法。...下面提供迭代法、递归法以及头插法三种方式实现单链表的反转,并按照思路难度递增排序: 4.1 迭代法 (Iterative) 这是最直观且容易理解的方法,与之前的解释相同。...return newHead; } 头插法的思路相对简单,但需要理解构建新链表的过程。...在实际应用中,迭代法由于其简洁性和避免了递归的栈深度问题,通常是首选。
参考demo1_迭代方式: /* 反转一个单链表。...使用迭代方式实现 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 力扣中测试执行用时 : 76 ms, 在所有 JavaScript 提交中击败了...:", node); console.log(".....反转....") console.log(reverseList(node)) 参考demo2_递归方式: /* 反转一个单链表。...,最后一个元素作为反转链表的第一个元素返回 */ return { first: cur, //反转链表的第一个元素 cur: cur //每次递归返回的一个元素...参考代码demo1_迭代方式: /** * 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。
单链表反转 单链表反转这道题可谓是链表里面的高频问题了,差不多可以说只要被问到链表,就会问单链表反转。 今天我们就一起来看下。...题目链接:https://leetcode-cn.com/problems/reverse-linked-list/ 点击文末的阅读原文也可到达。 题目描述: 反转一个单链表。...示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路 这道题是非常经典的一道题了,没有很多的套路,主要方法有迭代法和递归法两种方法实现。...个人感觉做链表题目,最重要的还是自己多写,多练。 方法一:迭代法 迭代法就是相当于假设有两个链表,其中一个链表是空的,我们要做的工作就是把当前链表的元素不断移动到空链表上。...head.next.next = head; head.next = null; return node; } } 复杂度分析 时间复杂度: 空间复杂度: 总结 递归法的时间复杂度比迭代法的空间复杂度要高
反转一个单链表 输入一个链表,反转链表后,输出新链表的表头。...1. python的非递归实现 思路很简单:1->2->3->4->5,遍历链表,把1的next置为None,2的next置为1,以此类推,5的next置为4。得到反转链表。...需要考虑链表只有1个元素的情况。图中有具体的每步迭代的思路,最后输出pre而不是cur是因为最后一次迭代后cur已经指向None了,而pre是完整的反向链表。...while cur: cur.next, prev, cur = prev, cur, cur.next return prev 2.python的递归实现...递归的方法其实是非常巧的,它利用递归走到链表的末端,然后再更新每一个node的next 值 ,实现链表的反转。
写在前面 此文会先探讨下什么是链表以及在 JavaScript 中的链表,接着我们会使用 JavaScript 这门语言动手实现下各类链表的设计,最后我们会抛出一些常规疑问,并从各个方面一一解答,总之...,必须要从起点(链表头部节点)开始迭代链表直到找到所需的元素,这点需要注意 JavaScript中的链表 上面我们简单介绍了常规链表的概念,但是在 JavaScript 这门语言中,我们怎么表示链表呢?...指针指向新添加的元素即可 新添加的元素 next 指针默认为 null,链表最后一个元素的 next 值也就为 null,另外,将节点挂到链表上之后,还需将链表的长度加 1,保证 length 属性等于链表长度...,这个比较简单,直接迭代即可,匹配到了返回对应索引,匹配不到返回 -1 // 获取链表中给定元素的索引 LinkedList.prototype.indexOf = function (val) {...这个方法在更新的时候是进行递归操作的,如果在更新的过程中有大量的节点需要更新,就会出现长时间占用 JS 主线程的情况,并且整个递归过程是无法被打断的,由于 JS 线程和 GUI 线程是互斥的(详看「硬核
所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取。链表有很多种不同的类型:单向链表、双向链表及循环链表。...链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难。...toString():由于列表项使用 Node 类,需要重写继承自 JavaScript 对象默认的 toString() 方法,让其只输出元素的值。...用链表的方式,输出一个反转后的单链表。...解题思路2.使用递归: 这里也可以使用递归,也可以参考反转链表的问题,终止条件是递归到链表为空,或者只剩下一个元素没得交换了,才终止。 ---- 解析: 题目出自:[Leetcode 24.
Js算法与数据结构拾萃(3):链表 补白 准备阅读: 《javascript数据结构和算法》读书笔记:链表 这仍然是笔者一年前的笔记。...题解2:链表迭代 用链表的思路,很容易想到做迭代: var removeElements = function(head, val) { let current=head;...你可以迭代或递归地反转链表。你能否用两种方法解决这道题?...题解2:递归 递归的思路是甩锅,解决不了推给下一代(“搁置争议,交给下一代的智慧去解决”)。 每代的智慧是什么呢? •遇到尾部next为null,递归终止•遇到头部,让它的next为空。...我们仍然以龟兔赛跑为例子:假设兔子在环上追上乌龟的地点是first。那么,乌龟走的距离为F+a。