单链表实现: public class MyLinkedList { private static class Entry{ private E value;...,这个迭代器对象可以作为一个工具来遍历集合类中的对象。...此外,迭代器更是设计模式,如对图的遍历可以实现一个图迭代器,简化代码,将遍历的思想抽象出来。 自己实现一个可以遍历上述单链表的迭代器,这个迭代器需要实现Iterator接口中的方法。...主要包括以下三个方法: (1)是否存在下一个对象元素 (2)返回下一个对象元素 (3)删除集合中的当前迭代器指向的对象元素 public class MyLinkedList ...show()方法的功能是相同的,但是迭代器为遍历集合对象元素提供了一种统一的方法,此外也可以使用迭代器做更多的事情。
从尾到头打印链表」 力扣题目链接[1] 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。...辅助栈法 首先,链表的特点是「从前到后」依次访问节点,而题目的要求是「倒序输出」节点,考虑使用后进先出的辅助栈进行解题。 思路:依次将链表节点放入辅助栈(数组)中。...反转链表」 力扣题目链接[2] 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。...递归 本题也可以使用递归进行处理,通过回溯来修改next指向。 使用递归进行解题,一定要写递归的终止条件,否则会造成死循环导致内存溢出。...总结 相较于递归,迭代法更容易理解。此处优先掌握迭代法进行题解。而递归更考验逻辑思维,通过后续的题解我们慢慢加强。
Linked List 206.反转链表 题目描述 反转一个单链表。...head.next = None return res 24.两两交换链表中的节点 题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...记录当前结点 cur = head # 记录头结点.等到程序结束返回head.next即可 head = p # 用stack保存每次迭代的两个节点...# 1是不能指向2的next,1应该指向4,而循环迭代的时候一次处理2个节点 # 1和2的关系弄清楚了,3和4的关系也能弄清楚,但需要一个指针来处理 #...3->4 # tmp和b都指向1节点,等下次迭代的时候 # a就变成3,b就变成4,然后tmp就指向b,也就是1指向4 tmp,b
原题链接[3] 思路 使用递归来解题 将两个链表头部较小的一个与剩下的元素合并 当两条链表中的一条为空时终止递归 关键点 掌握链表数据结构 考虑边界情况 复杂度分析 n + m 是两条链表的长度 时间复杂度...回到本题的递归解法: 写递归解法的话,老套路,先明确终止条件,链表中没有节点或只有一个节点时无法进行交换。 接下来递归的进行两两交换节点并更新指针关系。 返回新链表的头节点 newHead。...newHead; } 时间复杂度:O(n) 空间复杂度:O(n) 04 环形链表 原题链接[5] 快慢指针 使用快慢不同的两个指针遍历,快指针一次走两步,慢指针一次走一步。...原题链接[6] 迭代 初始化哨兵节点 prev 为 null,及当前节点 curr 指向头节点。...开始迭代,记录 next 指针留备后用,反转指针。 推进指针继续迭代,最后返回新的链表头节点 prev。
一、题目描述 来源:力扣(LeetCode) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 ... [0, 100] 内 0 <= Node.val <= 100 二、思路分析 我们利用一个 stack,然后不断迭代链表,每次取出两个节点放入 stack 中,再从 stack 中拿出两个节点。...拿出来的时候就是 2,1 两个节点了。 再把这两个节点串联起来,重复这个逻辑遍历完整个链表,就可以做到两两反转的效果了。...else { p.next = null; } return head.next; } } 四、运行结果 总结 这道题在于怎么交换之后链接之后的节点...,还可以使用迭代和递归来解题,相比于迭代和递归来说,用栈来解题,比较清晰易懂
一、题目 1、算法题目 “给定一个升序的链表,删除链表中重复的节点,返回升序排列的结果链表。” 题目链接: 来源:力扣(LeetCode) 链接:82....删除排序链表中的重复元素 II - 力扣(LeetCode) (leetcode-cn.com) 2、题目描述 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点...三、总结 对于链表或者树的问题,一般可以使用递归或迭代两种写法,本题就使用了递归。 递归的题目,最重要的是要清楚递归函数的定义和递归终止条件。...这道题的递归定义就是删除以头节点开头的链表中重复的节点。 那么递归终止条件就是如果cur为空,那么肯定没有重复的节点,直接返回cur。...如果cur.next为空,那么说明链表中只有一个节点,也没有出现重复的节点,直接返回cur。
最长的具有K个不同字符的子字符串(中) 模式二:双指针 “两个指针”是一种模式,其中两个指针串联遍历数据结构,直到一个或两个指针都达到特定条件。...您如何确定何时使用快速和慢速模式? 该问题将处理链表或数组中的循环 当您需要知道某个元素的位置或链表的总长度时。 什么时候应该在上面提到的“两指针”方法上使用它?...如何确定何时使用此模式: 如果要求您在不使用额外内存的情况下反向链接列表 链表模式就地反转的问题: 撤消子列表(中) 反转每个K元素子列表(中) 模式七:树的宽度优先搜索 此模式基于广度优先搜索(BFS...使用这种方法可以有效地解决涉及逐级遍历树的任何问题。 Tree BFS模式的工作原理是将根节点推送到队列,然后不断迭代直到队列为空。对于每次迭代,我们都删除队列开头的节点,然后“访问”该节点。...您可以使用递归(或使用堆栈进行迭代)在遍历时跟踪所有先前的(父)节点。
(1)第一种:先遍历链表,算出链表节点数count,第二次直接遍历到第count-k个节点。但是要注意,可能链表节点数count小于k,此时要返回NULL,所以要先判断这个条件。...2、解题思路: 2-1:第一种:使用递归方式: (1)解题思路: 假设链表为[1,2,3,4,5]先迭代到链表末尾5,然后从5开始依次反转整个链表。...如下图所示,先迭代待最后一位5,并且设置一个新的节点newList作为反转后链表的头结点,由于整个链表反转后的头就是最后一个数,所以newList存放的一直是反转后的头结点的地址,将head指向的地址赋值给...head.next.next=head; head.next=null; return newList; } } 2-2第二种:使用迭代方式...如果不是,则对链表进行迭代,然后给一个临时变量temp存储head.next,然后改变head.next的指向newList,然后把head赋值给newList,接着让head等于临时变量temp,就这样一直迭代完整个链表
链表和数组都是用于存储有序元素的集合,但有几点大不相同 链表不同于数组,链表中的元素在内存中并不是连续放置的 链表添加或移除元素不需要移动其他元素 数组可以直接访问任何一个位置的元素,链表必须从表头开始迭代到指定位置访问...长度为3的单链表 每个元素由一个存储元素本身data的节点和一个指向下一个元素的引用next(也称指针或链接)组成 尾节点的引用next指向为null 类比:寻宝游戏,你有一条线索,这条线索是指向寻找下一条线索的地点的指针..._link.clear() } } 3.2 链表翻转【面试常考】 (1)迭代法 迭代法的核心就是currNode.next = prevNode,然后从头部一次向后轮询 ?...node) return;// 递归终止条件 _reversePrint(node.next); console.log(node.data); }; 四、双向链表和循环链表 4.1 双向链表...双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素,如下图 ?
两两交换链表中的节点」,难度为 Medium。 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: ?...链表和树的题目天然适合使用递归来做。...交换的前提条件:节点 root 后面至少有两个节点。...复杂度为 空间复杂度: 迭代解法(哨兵技巧) 所有的递归都能转化为迭代: class Solution { public ListNode swapPairs(ListNode head)...在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。...如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示: ?...图(3)经过第二次迭代后的状态 那么循环终止条件呢?现在对图(3)的状态再迭代一次得到图(4)的状态: ?...图(4)经过第三次迭代后的状态 此时可以看出,在图(4)的基础上再进行一次迭代就可以完成链表的逆序,因此循环迭代的终止条件就是当前的head指针是NULL。...图(6)第二次递归状态图 再进行一次递归分析,就能清楚地看到递归终止条件了: ? 图(7)第三次递归状态图 递归终止条件就是链表只剩一个节点时直接返回这个节点的指针。
因为头节点没有前一个节点,所以使用NULL作为prev的初始值可以帮助我们处理这种情况。...这个算法分为两个主要阶段: 确定链表中是否存在环: 使用两个指针,slow和fast,它们初始时都指向链表的头节点head。然后,slow每次向前移动一个节点,而fast每次向前移动两个节点。...这意味着从相交点到链表的末尾,这两个链表都具有相同的节点 解决相交链表问题的一个有效方法是使用两个指针遍历两个链表。...在这一步中,恢复原始链表的next指针,并将复制链表的next指针指向正确的节点 所以这道题只是逻辑复杂一点,并没有很难理解 8.反转链表 题目链接: 206.反转链表 题目描述: 方法一:迭代法...迭代法通过遍历链表,逐个改变节点的指向来实现链表的反转。
链表和数组都是用于存储有序元素的集合,但有几点大不相同 链表不同于数组,链表中的元素在内存中并不是连续放置的 链表添加或移除元素不需要移动其他元素 数组可以直接访问任何一个位置的元素,链表必须从表头开始迭代到指定位置访问...下面是单链表的基本结构 长度为3的单链表 每个元素由一个存储元素本身data的节点和一个指向下一个元素的引用next(也称指针或链接)组成 尾节点的引用next指向为null 类比:寻宝游戏,你有一条线索..._link.clear() } } 3.2 链表翻转【面试常考】 (1)迭代法 迭代法的核心就是currNode.next = prevNode,然后从头部一次向后轮询 代码实现 reverse()...node) return;// 递归终止条件 _reversePrint(node.next); console.log(node.data); }; 四、双向链表和循环链表 4.1 双向链表...双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素,如下图 正是因为这种变化,使得链表相邻节点之间不仅只有单向关系
迭代实现 2.1 分析 实现链表反转,我们需要从第二个节点开始遍历,将当前节点的 next 指向前一个节点。这里需要注意的是,该变当前节点的 next 时,需要提前保存 next,不然遍历就会中断。...2.2 实现 //@brief: 迭代方式,实现单向链表反转 LinkNode* Reverse(LinkNode* header) { if (header == NULL || header->next...= NULL) { cout"; } } cout<<endl; } int main(int argc, char* argv[]) { //创建单向链接 LinkNode...此种方法可以使用递归来实现。 时间复杂度 O(n); 空间复杂度 O(n)。 由于每次递归都需要为实参分配空间,所以相较于非递归实现,较为耗费栈空间,且不易理解。...3.2 实现 //@brief: 递归方式,实现单链表反转 LinkNode * Reverse(LinkNode * head) { //递归终止条件:找到链表最后一个结点 if (head ==
也就是说,我反转k个节点之后,跳过k个节点,再反转k个节点,以此类推。反转一个链表不复杂,但是通常我们遇到的题目会附加额外条件,比如:不允许开辟额外的内存空间。...我们先来看看反转一个链表我们会怎么做,我们的思路很直接,从头开始依次取节点,让它指向前面一个节点,到最后我们的链表就反转完成了。...,此时它已经成为反转后链表的head return previous; } 我们只要保存好下一个要处理的节点的索引,保证可以按顺序迭代,之后按照正常思路反转引用就好。...,我才不说我是故意的)这边唯一的区别在于我们得跳过K个节点。管它呢,我们还可以遵循上面那个流程,只不过在每次迭代后,跳过k节点,这不就行了嘛!...整个过程中,我们只迭代一次链表,时间复杂度为O(n),而因为我们没有开辟额外的内存空间,空间复杂度为O(1)。
题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 ?...链表和树的题目天然适合使用递归来做。...交换的前提条件:节点 root 后面至少有两个节点。...复杂度为 O(n) 空间复杂度:O(1) ---- 迭代解法(哨兵技巧) 所有的递归都能转化为迭代: class Solution { public ListNode swapPairs(ListNode...在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和一些其他的优选题解。
,节点不仅存储了键值对信息,还可以使用next,before,after来链接前后节点,next引用仅用于HashMap结构中链接同一个桶中的后一个元素,而before和after引用则是用来链接LinkedHashMap...,会调用覆盖过的newNode方法,将插入的元素链接的链表尾部,删除节点的时候,将该节点的前后节点相连即可,当节点被访问时,可以将其放到链表尾部(该特性后面会讲解)。...此实现与 HashMap 的不同之处在于它维护了一个贯穿其所有条目的双向链表。 * 此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。...节点类的更改还需要使用两个字段(头部,尾部)而不是指向标头节点的指针来维护列表之前/之后的双向链接。 * 此类以前还在访问,插入和删除时使用了不同类型的回调方法。...,true代表使用访问顺序进行迭代,false代表使用插入顺序进行迭代 */ final boolean accessOrder; // 内部工具方法 // 链接到链表尾部
4.解题思路 4.1 思路 反转链表是一道经典的面试题。 实现链表反转步骤如下: 使用一个全局变量保留每个结点的前驱结点,记为 pre。...当前结点作为前驱结点赋给 pre,当前结点的 next 结点赋值给当前结点,继续迭代,直到为 NULL。 4.2 复杂度分析 时间复杂度 O(n),n 为链表长度。遍历一遍链表即可完成反转。...5.实现示例 5.1 C++ struct LinkNode { int value; LinkNode* next; }; // Reverse 实现单向链表反转(迭代方式)。...注意每次反转后要将当前节点的 next 置空,表示断开当前节点与后一个节点的关联。此种方法可以使用递归来实现。 时间复杂度 O(n); 空间复杂度 O(n)。...6.2 实现示例 // Reverse 实现单链表反转(递归方式)。 LinkNode* Reverse(LinkNode * head) { // 递归终止条件:找到链表最后一个结点。
1、非递归(迭代)方式 迭代的方式是从链头开始处理,如下图给定一个存放5个数的链表。...首先指针H迭代到底如下图所示,并且设置一个新的指针作为翻转后的链表的头。由于整个链表翻转之后的头就是最后一个数,所以整个过程NewH指针一直指向存放5的地址空间。...然后H指针逐层返回的时候依次做下图的处理,将H指向的地址赋值给H->next->next指针,并且一定要记得让H->next =NULL,也就是断开现在指针的链接,否则新的链表形成了环,下一层H->next...reverseList(ListNode head) { if(head == null || head.next == null){ return head; } // 记录前一个节点和当前节点...ListNode newHead = null; ListNode current = head; // 循环条件 while(current !
其初值为 pre = head pre.next = null cur = head.next next = null 迭代过程中先使用next存储当前位置的下一个结点,再让当前位置指向其前一个节点,然后更新前一个节点跟新当前结点...递归结束条件:当前结点不存在后续结点,直接返回其本身即可。 图解如下: ? 上述图的当前结点为首结点的情况。...给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。...使用递归求解 + 迭代求解。整体上进行递归,而递归内部反转K个结点使用迭代。
领取专属 10元无门槛券
手把手带您无忧上云