用 JavaScript 实现链表操作 - 18 Recursive Reverse

2017-02-25
阅读 1 分钟
2.9k
麻烦的地方就在最后,把节点加入链表的末尾需要首先遍历整个链表,这无疑非常低效。我们在上一个 kata 的循环里是怎么解决的呢?维护一个 result 变量代表反转链表,然后每次把新节点放到 result 的头部,同时把新节点当做新的 result ,大概这个样子:

用 JavaScript 实现链表操作 - 17 Iterative Reverse

2017-02-24
阅读 1 分钟
2.5k
思路是,从前到后遍历链表,对每个节点复制一份,并让它的 next 指向前一个节点。最后 result 就是一个反转的新链表了。那么如何修改 list 呢?很简单,把 result 的首节点值赋给 list ,然后让 list 指向 result 的第二个节点就行。

用 JavaScript 实现链表操作 - 16 Sorted Intersect

2017-02-20
阅读 2 分钟
2k
实现函数 sortedIntersect() 取两个已排序的链表的交集,交集指两个链表都有的节点,节点不一定连续。每个链表应该只遍历一次。结果链表中不能包含重复的节点。

用 JavaScript 实现链表操作 - 15 Merge Sort

2017-02-18
阅读 1 分钟
2.7k
实现函数 mergeSort() 进行归并排序。注意这种排序法需要使用递归。在 frontBackSplit() 和 sortedMerge() 两个函数的帮助下,你可以很轻松的写一个递归的排序。基本算法是,把一个链表切分成两个更小的链表,递归地对它们进行排序,最终把两个排好序的小链表合成完整的链表。

用 JavaScript 实现链表操作 - 14 Sorted Merge

2017-02-18
阅读 2 分钟
2.2k
实现函数 sortedMerge() 把两个升序排列的链表合并成一个新链表,新链表也必须是升序排列的。这个函数应该对每个输入的链表都只遍历一次。

用 JavaScript 实现链表操作 - 13 Shuffle Merge

2017-02-18
阅读 2 分钟
2.2k
实现函数 shuffleMerge() 把两个链表合并成一个。新链表的节点是交叉从两个链表中取的。这叫洗牌合并。举个例子,当传入的链表为 1 -> 2 -> 3 -> null 和 7 -> 13 -> 1 -> null 时,合并后的链表为 1 -> 7 -> 2 -> 13 -> 3 -> 1 -> null 。如果合并过程中一个链表的数据先取完了,...

用 JavaScript 实现链表操作 - 12 Front Back Split

2017-02-03
阅读 3 分钟
3.4k
实现函数 frontBackSplit() 把链表居中切分成两个子链表 -- 一个前半部分,另一个后半部分。如果节点数为奇数,则多余的节点应该归类到前半部分中。例子如下,注意 front 和 back 是作为空链表被函数修改的,所以这个函数不需要返回值。

用 JavaScript 实现链表操作 - 11 Alternating Split

2017-02-02
阅读 2 分钟
2.4k
实现一个 alternatingSplit() 函数,把一个链表切分成两个。子链表的节点应该是在父链表中交替出现的。如果原链表是 a -> b -> a -> b -> a -> null ,则两个子链表分别为 a -> a -> a -> null 和 b -> b -> null 。

用 JavaScript 实现链表操作 - 10 Move Node In-place

2017-01-11
阅读 2 分钟
3k
TL;DR 用 in-place 的方式把一个链表的首节点移到另一个链表(不改变链表的引用),系列目录见 前言和目录 。 需求 实现一个 moveNode() 函数,把源链表的头结点移到目标链表的开头。要求是不能修改两个链表的引用。 {代码...} 当碰到以下的情况应该抛出异常: 源链表为 null 目标链表为 null 源链表是空节点,data 属性...

用 JavaScript 实现链表操作 - 09 Move Node

2017-01-08
阅读 1 分钟
2.4k
实现一个 moveNode() 函数,把源链表的头节点移到目标链表。当源链表为空时函数应抛出异常。为了简化起见,我们会用一个 Context 对象来存储改变后的源链表和目标链表的引用。它也是函数的返回值。

用 JavaScript 实现链表操作 - 08 Remove Duplicates

2017-01-08
阅读 4 分钟
5k
实现一个 removeDuplicates() 函数,给定一个升序排列过的链表,去除链表中重复的元素,并返回修改后的链表。理想情况下链表只应该被遍历一次。

用 JavaScript 实现链表操作 - 07 Append

2017-01-08
阅读 1 分钟
2.5k
append 本身就可以作为递归的逻辑。append(listA, listB) 实际上等于 listA.next = append(listA.next, listB) ,直到 listA 递归到末尾 null ,这时 append(null, listB) 直接返回 listB 即可。加上边界条件判断,代码如下:

用 JavaScript 实现链表操作 - 06 Insert Sort

2016-12-31
阅读 2 分钟
3.2k
实现一个 insertSort() 函数对链表进行升序排列(插入排序)。实现过程中可以使用 上一个 kata 中的 sortedInsert() 函数。insertSort() 函数接受链表头为参数并返回排序后的链表头。

用 JavaScript 实现链表操作 - 05 Sorted Insert

2016-12-25
阅读 3 分钟
2.5k
写一个 sortedInsert() 函数,把一个节点插入一个已排序的链表中,链表为升序排列。这个函数接受两个参数:一个链表的头节点和一个数据,并且始终返回新链表的头节点。

用 JavaScript 实现链表操作 - 04 Insert Nth Node

2016-12-14
阅读 3 分钟
2.8k
insertNth() 可以看成是 01 Push & Build List 中的 push() 函数的更通用版本。给定一个链表,一个范围在 0..length 内的索引号,和一个数据,这个函数会生成一个新的节点并插入到指定的索引位置,并始终返回链表的头。

用 JavaScript 实现链表操作 - 03 Get Nth Node

2016-12-08
阅读 1 分钟
2.2k
实现一个 getNth() 方法,传入一个链表和一个索引,返回索引代表的节点。索引以 0 为起始,第一个元素索引为 0 ,第二个为 1 ,以此类推。比如:

用 JavaScript 实现链表操作 - 02 Length & Count

2016-12-04
阅读 2 分钟
4.7k
递归是最有表达力的版本。思路非常简单。每个链表的长度 length(head) 都等于 1 + length(head.next) 。空链表长度为 0 。

用 JavaScript 实现链表操作 - 01 Push & Build List

2016-11-28
阅读 2 分钟
3.8k
写两个方法 push 和 buildList 来初始化链表。尝试在 buildList 中使用 push 。下面的例子中我用 a -> b -> c 来表示链表,这是为了书写方便,并不是 JavaScript 的有效语法。

用 JavaScript 实现链表操作 - 前言和目录

2016-11-20
阅读 1 分钟
3.7k
我打算写一个链表操作的系列,来自 Codewars 的 Linked List 系列 kata ,实现语言是 JavaScript 。这篇是开篇,简单描述了一下我写这个的目的,也作为系列的目录。

Kata: 下一个更大的数字

2016-09-10
阅读 3 分钟
4.3k
这是一个 Coderwars 上的练习,等级 4kyu 。Coderwars 上的题目分为 8 级,数字越小越难。这题算是中等难度。下面是我的分析和解法,语言使用的 JavaScript ,但你也可以用任何其他语言来实现。