|
|
|
|
@ -1,15 +1,21 @@
|
|
|
|
|
# 链表 (双向)
|
|
|
|
|
|
|
|
|
|
Core模块提供了称为[双链表](https://en.wikipedia.org/wiki/Doubly_linked_list)的实用数据结构. 简而言之双向链表是一系列记录(又称节点),这些记录具有上一个节点,下一个节点及其自身值(或数据)的信息.
|
|
|
|
|
@abp/utils包提供了称为[双链表](https://en.wikipedia.org/wiki/Doubly_linked_list)的实用数据结构. 简而言之双向链表是一系列记录(又称节点),这些记录具有上一个节点,下一个节点及其自身值(或数据)的信息.
|
|
|
|
|
|
|
|
|
|
## 入门
|
|
|
|
|
|
|
|
|
|
要创建一个双向链表,你需要做的就是导入和创建它的一个新的实例:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
import { LinkedList } from '@abp/ng.core';
|
|
|
|
|
import { LinkedList } from '@abp/utils';
|
|
|
|
|
|
|
|
|
|
const list = new LinkedList();
|
|
|
|
|
var list = new LinkedList();
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
MVC:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
var list = new abp.utils.common.LinkedList();
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
构造函数没有任何参数.
|
|
|
|
|
@ -24,7 +30,7 @@ const list = new LinkedList();
|
|
|
|
|
#### addHead(value)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addHead(value: T): ListNode\<T\>
|
|
|
|
|
addHead(value: T): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将给定值添加到链表的第一个节点:
|
|
|
|
|
@ -48,7 +54,7 @@ list.addHead('c');
|
|
|
|
|
#### addManyHead(values)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addManyHead(values: T\[\]): ListNode\<T\>\[\]
|
|
|
|
|
addManyHead(values: T[]): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将给定的多个值添加到链表的第一个节点:
|
|
|
|
|
@ -68,7 +74,7 @@ list.addManyHead(['x', 'y', 'z']);
|
|
|
|
|
#### addTail(value)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addTail(value: T): ListNode\<T\>
|
|
|
|
|
addTail(value: T): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将给定值添加到链表的最后一个节点:
|
|
|
|
|
@ -92,7 +98,7 @@ list.addTail('c');
|
|
|
|
|
#### addManyTail(values)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addManyTail(values: T\[\]): ListNode\<T\>\[\]
|
|
|
|
|
addManyTail(values: T[]): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将给定多个值添加到链表的最后一个节点:
|
|
|
|
|
@ -107,10 +113,10 @@ list.addManyTail(['x', 'y', 'z']);
|
|
|
|
|
// "a" <-> "b" <-> "c" <-> "x" <-> "y" <-> "z"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### addAfter(value, previousValue, compareFn)
|
|
|
|
|
#### addAfter(value, previousValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addAfter(value: T, previousValue: T, compareFn = compare): ListNode\<T\>
|
|
|
|
|
addAfter(value: T, previousValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
添加给定值到previousValue节点后:
|
|
|
|
|
@ -151,10 +157,10 @@ list.addAfter(
|
|
|
|
|
> 默认的比较函数检查深度相等性,因此你几乎不需要传递该参数.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### addManyAfter(values, previousValue, compareFn)
|
|
|
|
|
#### addManyAfter(values, previousValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addManyAfter(values: T\[\], previousValue: T, compareFn = compare): ListNode\<T\>\[\]
|
|
|
|
|
addManyAfter(values: T[], previousValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
添加给定的多个值到previousValue节点后:
|
|
|
|
|
@ -188,10 +194,10 @@ list.addManyAfter(
|
|
|
|
|
> 默认的比较函数检查深度相等性,因此你几乎不需要传递该参数.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### addBefore(value, nextValue, compareFn)
|
|
|
|
|
#### addBefore(value, nextValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addBefore(value: T, nextValue: T, compareFn = compare): ListNode\<T\>
|
|
|
|
|
addBefore(value: T, nextValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
添加给值到previousValue节点前:
|
|
|
|
|
@ -231,10 +237,10 @@ list.addBefore(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### addManyBefore(values, nextValue, compareFn)
|
|
|
|
|
#### addManyBefore(values, nextValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addManyBefore(values: T\[\], nextValue: T, compareFn = compare): ListNode\<T\>\[\]
|
|
|
|
|
addManyBefore(values: T[], nextValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -277,7 +283,7 @@ list.addManyBefore(
|
|
|
|
|
#### addByIndex(value, position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addByIndex(value: T, position: number): ListNode\<T\>
|
|
|
|
|
addByIndex(value: T, position: number): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在链表的指定位置添加节点:
|
|
|
|
|
@ -313,7 +319,7 @@ list.addByIndex('x', -1);
|
|
|
|
|
#### addManyByIndex(values, position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addManyByIndex(values: T\[\], position: number): ListNode\<T\>\[\]
|
|
|
|
|
addManyByIndex(values: T[], position: number): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
添加多个节点到链表的指定位置:
|
|
|
|
|
@ -345,7 +351,7 @@ list.addManyByIndex(['x', 'y'], -1);
|
|
|
|
|
#### add(value).head()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
add(value: T).head(): ListNode\<T\>
|
|
|
|
|
add(value: T).head(): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的节点移动到链表头:
|
|
|
|
|
@ -373,7 +379,7 @@ list.add('c').head();
|
|
|
|
|
#### add(value).tail()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
add(value: T).tail(): ListNode\<T\>
|
|
|
|
|
add(value: T).tail(): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的节点移动到链表尾:
|
|
|
|
|
@ -398,10 +404,10 @@ list.add('c').tail();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### add(value).after(previousValue, compareFn)
|
|
|
|
|
#### add(value).after(previousValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
add(value: T).after(previousValue: T, compareFn = compare): ListNode\<T\>
|
|
|
|
|
add(value: T).after(previousValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的节点移动到指定节点后:
|
|
|
|
|
@ -445,10 +451,10 @@ list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### add(value).before(nextValue, compareFn)
|
|
|
|
|
#### add(value).before(nextValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
add(value: T).before(nextValue: T, compareFn = compare): ListNode\<T\>
|
|
|
|
|
add(value: T).before(nextValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的节点移动到指定节点前:
|
|
|
|
|
@ -495,7 +501,7 @@ list
|
|
|
|
|
#### add(value).byIndex(position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
add(value: T).byIndex(position: number): ListNode\<T\>
|
|
|
|
|
add(value: T).byIndex(position: number): ListNode<T>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的节点移动到链表指定位置:
|
|
|
|
|
@ -537,7 +543,7 @@ list.add('x').byIndex(-1);
|
|
|
|
|
#### addMany(values).head()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addMany(values: T\[\]).head(): ListNode\<T\>\[\]
|
|
|
|
|
addMany(values: T[]).head(): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的多个节点移动到链表头:
|
|
|
|
|
@ -561,7 +567,7 @@ list.addMany(['x', 'y', 'z']).head();
|
|
|
|
|
#### addMany(values).tail()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addMany(values: T\[\]).tail(): ListNode\<T\>\[\]
|
|
|
|
|
addMany(values: T[]).tail(): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的多个节点移动到链表尾:
|
|
|
|
|
@ -582,10 +588,10 @@ list.addMany(['x', 'y', 'z']).tail();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### addMany(values).after(previousValue, compareFn)
|
|
|
|
|
#### addMany(values).after(previousValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addMany(values: T\[\]).after(previousValue: T, compareFn = compare): ListNode\<T\>\[\]
|
|
|
|
|
addMany(values: T[]).after(previousValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的多个节点移动到指定节点后:
|
|
|
|
|
@ -624,10 +630,10 @@ list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### addMany(values).before(nextValue, compareFn)
|
|
|
|
|
#### addMany(values).before(nextValue [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addMany(values: T\[\]).before(nextValue: T, compareFn = compare): ListNode\<T\>\[\]
|
|
|
|
|
addMany(values: T[]).before(nextValue: T, compareFn?: ListComparisonFn<T>): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的多个节点移动到指定节点前:
|
|
|
|
|
@ -669,7 +675,7 @@ list
|
|
|
|
|
#### addMany(values).byIndex(position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
addMany(values: T\[\]).byIndex(position: number): ListNode\<T\>\[\]
|
|
|
|
|
addMany(values: T[]).byIndex(position: number): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将添加的多个节点移动到链表的指定位置:
|
|
|
|
|
@ -712,7 +718,7 @@ list.addMany(['x', 'y']).byIndex(-1);
|
|
|
|
|
#### dropHead()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropHead(): ListNode\<T\> | undefined
|
|
|
|
|
dropHead(): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表的第一个节点:
|
|
|
|
|
@ -732,7 +738,7 @@ list.dropHead();
|
|
|
|
|
#### dropManyHead(count)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropManyHead(count: number): ListNode\<T\>\[\]
|
|
|
|
|
dropManyHead(count: number): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除指定数量的链表的头节点:
|
|
|
|
|
@ -752,7 +758,7 @@ list.dropManyHead(2);
|
|
|
|
|
#### dropTail()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropTail(): ListNode\<T\> | undefined
|
|
|
|
|
dropTail(): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表的最后一个节点:
|
|
|
|
|
@ -772,7 +778,7 @@ list.dropTail();
|
|
|
|
|
#### dropManyTail(count)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropManyTail(count: number): ListNode\<T\>\[\]
|
|
|
|
|
dropManyTail(count: number): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除指定数量的链表的尾节点:
|
|
|
|
|
@ -792,7 +798,7 @@ list.dropManyTail(2);
|
|
|
|
|
#### dropByIndex(position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropByIndex(position: number): ListNode\<T\> | undefined
|
|
|
|
|
dropByIndex(position: number): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中给定位置的节点:
|
|
|
|
|
@ -825,7 +831,7 @@ list.dropByIndex(-2);
|
|
|
|
|
#### dropManyByIndex(count, position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropManyByIndex(count: number, position: number): ListNode\<T\>\[\]
|
|
|
|
|
dropManyByIndex(count: number, position: number): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中给定位置与数量的多个节点:
|
|
|
|
|
@ -856,10 +862,10 @@ list.dropManyByIndex(2, -2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### dropByValue(value, compareFn)
|
|
|
|
|
#### dropByValue(value [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropByValue(value: T, compareFn = compare): ListNode\<T\> | undefined
|
|
|
|
|
dropByValue(value: T, compareFn?: ListComparisonFn<T>): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中含有给定值的第一个节点:
|
|
|
|
|
@ -894,10 +900,10 @@ list.dropByValue(0, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### dropByValueAll(value, compareFn)
|
|
|
|
|
#### dropByValueAll(value [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropByValueAll(value: T, compareFn = compare): ListNode\<T\>\[\]
|
|
|
|
|
dropByValueAll(value: T, compareFn?: ListComparisonFn<T>): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中含有给定值的所有节点:
|
|
|
|
|
@ -933,7 +939,7 @@ list.dropByValue(0, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
#### drop().head()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
drop().head(): ListNode\<T\> | undefined
|
|
|
|
|
drop().head(): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表的头节点:
|
|
|
|
|
@ -957,7 +963,7 @@ list.drop().head();
|
|
|
|
|
#### drop().tail()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
drop().tail(): ListNode\<T\> | undefined
|
|
|
|
|
drop().tail(): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表的尾节点:
|
|
|
|
|
@ -981,7 +987,7 @@ list.drop().tail();
|
|
|
|
|
#### drop().byIndex(position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
drop().byIndex(position: number): ListNode\<T\> | undefined
|
|
|
|
|
drop().byIndex(position: number): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表指定位置的节点:
|
|
|
|
|
@ -1016,10 +1022,10 @@ list.drop().byIndex(-2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### drop().byValue(value, compareFn)
|
|
|
|
|
#### drop().byValue(value [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
drop().byValue(value: T, compareFn = compare): ListNode\<T\> | undefined
|
|
|
|
|
drop().byValue(value: T, compareFn?: ListComparisonFn<T>): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中含有给定值的第一个节点:
|
|
|
|
|
@ -1058,10 +1064,10 @@ list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### drop().byValueAll(value, compareFn)
|
|
|
|
|
#### drop().byValueAll(value [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
drop().byValueAll(value: T, compareFn = compare): ListNode\<T\>\[\]
|
|
|
|
|
drop().byValueAll(value: T, compareFn?: ListComparisonFn<T>): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中含有给定值的所有节点:
|
|
|
|
|
@ -1103,7 +1109,7 @@ list
|
|
|
|
|
#### dropMany(count).head()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropMany(count: number).head(): ListNode\<T\>\[\]
|
|
|
|
|
dropMany(count: number).head(): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中指定数量的头节点:
|
|
|
|
|
@ -1127,7 +1133,7 @@ list.dropMany(2).head();
|
|
|
|
|
#### dropMany(count).tail()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropMany(count: number).tail(): ListNode\<T\>\[\]
|
|
|
|
|
dropMany(count: number).tail(): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中指定数量的尾节点::
|
|
|
|
|
@ -1151,7 +1157,7 @@ list.dropMany(2).tail();
|
|
|
|
|
#### dropMany(count).byIndex(position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
dropMany(count: number).byIndex(position: number): ListNode\<T\>\[\]
|
|
|
|
|
dropMany(count: number).byIndex(position: number): ListNode<T>[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
删除链表中指定位置和数量的节点:
|
|
|
|
|
@ -1190,12 +1196,34 @@ list.dropMany(2).byIndex(-2);
|
|
|
|
|
|
|
|
|
|
有几个方法找到链表特定节点.
|
|
|
|
|
|
|
|
|
|
#### head
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
head: ListNode<T> | undefined;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
链表中的第一个节点.
|
|
|
|
|
|
|
|
|
|
#### tail
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
tail: ListNode<T> | undefined;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
链表中的最后一个节点.
|
|
|
|
|
|
|
|
|
|
#### length
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
length: number;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
链表的节点总数.
|
|
|
|
|
|
|
|
|
|
#### find(predicate)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
find(predicate: ListIteratorFunction\<T\>): ListNode\<T\> | undefined
|
|
|
|
|
find(predicate: ListIteratorFunction<T>): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
从链表中找到与给定谓词匹配的第一个节点:
|
|
|
|
|
@ -1205,7 +1233,7 @@ list.addTailMany(['a', 'b', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
const found = list.find(node => node.value === 'b');
|
|
|
|
|
var found = list.find(node => node.value === 'b');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
found.value === "b"
|
|
|
|
|
@ -1214,12 +1242,10 @@ found.next.value === "b"
|
|
|
|
|
*/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### findIndex(predicate)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
findIndex(predicate: ListIteratorFunction\<T\>): number
|
|
|
|
|
findIndex(predicate: ListIteratorFunction<T>): number
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
从链表中找到与给定谓词匹配的第一个节点的位置:
|
|
|
|
|
@ -1229,10 +1255,10 @@ list.addTailMany(['a', 'b', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
const i0 = list.findIndex(node => node.next && node.next.value === 'b');
|
|
|
|
|
const i1 = list.findIndex(node => node.value === 'b');
|
|
|
|
|
const i2 = list.findIndex(node => node.previous && node.previous.value === 'b');
|
|
|
|
|
const i3 = list.findIndex(node => node.value === 'x');
|
|
|
|
|
var i0 = list.findIndex(node => node.next && node.next.value === 'b');
|
|
|
|
|
var i1 = list.findIndex(node => node.value === 'b');
|
|
|
|
|
var i2 = list.findIndex(node => node.previous && node.previous.value === 'b');
|
|
|
|
|
var i3 = list.findIndex(node => node.value === 'x');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
i0 === 0
|
|
|
|
|
@ -1247,7 +1273,7 @@ i3 === -1
|
|
|
|
|
#### get(position)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
get(position: number): ListNode\<T\> | undefined
|
|
|
|
|
get(position: number): ListNode<T> | undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
查找并返回链表中特定位置的节点:
|
|
|
|
|
@ -1257,7 +1283,7 @@ list.addTailMany(['a', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
const found = list.get(1);
|
|
|
|
|
var found = list.get(1);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
found.value === "b"
|
|
|
|
|
@ -1268,10 +1294,10 @@ found.next.value === "c"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### indexOf(value, compareFn)
|
|
|
|
|
#### indexOf(value [, compareFn])
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
indexOf(value: T, compareFn = compare): number
|
|
|
|
|
indexOf(value: T, compareFn?: ListComparisonFn<T>): number
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在链表中找到匹配给定值的第一个节点位置:
|
|
|
|
|
@ -1281,10 +1307,10 @@ list.addTailMany(['a', 'b', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
const i0 = list.indexOf('a');
|
|
|
|
|
const i1 = list.indexOf('b');
|
|
|
|
|
const i2 = list.indexOf('c');
|
|
|
|
|
const i3 = list.indexOf('x');
|
|
|
|
|
var i0 = list.indexOf('a');
|
|
|
|
|
var i1 = list.indexOf('b');
|
|
|
|
|
var i2 = list.indexOf('c');
|
|
|
|
|
var i3 = list.indexOf('x');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
i0 === 0
|
|
|
|
|
@ -1303,11 +1329,11 @@ list.addTailMany([{ x: 1 }, { x: 0 }, { x: 2 }, { x: 0 }, { x: 3 }]);
|
|
|
|
|
|
|
|
|
|
// {"x":1} <-> {"x":0} <-> {"x":2} <-> {"x":0} <-> {"x":3}
|
|
|
|
|
|
|
|
|
|
const i0 = indexOf(1, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
const i1 = indexOf(2, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
const i2 = indexOf(3, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
const i3 = indexOf(0, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
const i4 = indexOf(4, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
var i0 = indexOf(1, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
var i1 = indexOf(2, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
var i2 = indexOf(3, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
var i3 = indexOf(0, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
var i4 = indexOf(4, (value, searchedValue) => value.x === searchedValue);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
i0 === 0
|
|
|
|
|
@ -1330,10 +1356,10 @@ i4 === -1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### forEach(callback)
|
|
|
|
|
#### forEach(iteratorFn)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
forEach(callback: ListIteratorFunction\<T\>): void
|
|
|
|
|
forEach(iteratorFn: ListIteratorFn<T>): void
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
从头到尾在链表中的所有节点上运行回调函数:
|
|
|
|
|
@ -1359,7 +1385,7 @@ list.addTailMany(['a', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
for(const node of list) {
|
|
|
|
|
for(var node of list) { /* ES6 for...of statement */
|
|
|
|
|
console.log(node.value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1373,7 +1399,7 @@ for(const node of list) {
|
|
|
|
|
#### toArray()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
toArray(): T\[\]
|
|
|
|
|
toArray(): T[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
转换链表值为数组:
|
|
|
|
|
@ -1383,7 +1409,7 @@ list.addTailMany(['a', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
const arr = list.toArray();
|
|
|
|
|
var arr = list.toArray();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
arr === ['a', 'b', 'c']
|
|
|
|
|
@ -1395,7 +1421,7 @@ arr === ['a', 'b', 'c']
|
|
|
|
|
#### toNodeArray()
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
toNodeArray(): T\[\]
|
|
|
|
|
toNodeArray(): T[]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
转换链表节点为数组:
|
|
|
|
|
@ -1405,7 +1431,7 @@ list.addTailMany(['a', 'b', 'c']);
|
|
|
|
|
|
|
|
|
|
// "a" <-> "b" <-> "c"
|
|
|
|
|
|
|
|
|
|
const arr = list.toNodeArray();
|
|
|
|
|
var arr = list.toNodeArray();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
arr[0].value === 'a'
|
|
|
|
|
@ -1414,12 +1440,10 @@ arr[2].value === 'a'
|
|
|
|
|
*/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### toString()
|
|
|
|
|
#### toString(mapperFn)
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
toString(): string
|
|
|
|
|
toString(mapperFn: ListMapperFn<T> = JSON.stringify): string
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
将链表转换为节点及其关系的字符串表示形式:
|
|
|
|
|
@ -1429,7 +1453,7 @@ list.addTailMany(['a', 2, 'c', { k: 4, v: 'd' }]);
|
|
|
|
|
|
|
|
|
|
// "a" <-> 2 <-> "c" <-> {"k":4,"v":"d"}
|
|
|
|
|
|
|
|
|
|
const str = list.toString();
|
|
|
|
|
var str = list.toString();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
str === '"a" <-> 2 <-> "c" <-> {"k":4,"v":"d"}'
|
|
|
|
|
@ -1443,12 +1467,89 @@ list.addMany([{ x: 1 }, { x: 2 }, { x: 3 }, { x: 4 }, { x: 5 }]).tail();
|
|
|
|
|
|
|
|
|
|
// {"x":1} <-> {"x":2} <-> {"x":3} <-> {"x":4} <-> {"x":5}
|
|
|
|
|
|
|
|
|
|
const str = list.toString(value => value.x);
|
|
|
|
|
var str = list.toString(value => value.x);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
str === '1 <-> 2 <-> 3 <-> 4 <-> 5'
|
|
|
|
|
*/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## API
|
|
|
|
|
|
|
|
|
|
### Classes
|
|
|
|
|
|
|
|
|
|
#### LinkedList
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
export class LinkedList<T = any> {
|
|
|
|
|
|
|
|
|
|
// properties and methods are explained above
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### ListNode
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
export class ListNode<T = any> {
|
|
|
|
|
next: ListNode | undefined;
|
|
|
|
|
|
|
|
|
|
previous: ListNode | undefined;
|
|
|
|
|
|
|
|
|
|
constructor(public readonly value: T) {}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`ListNode` 是存储在 `LinkedList` 中的每个记录的节点.
|
|
|
|
|
|
|
|
|
|
- `value` value是存储在节点中的值,通过构造函数传递.
|
|
|
|
|
- `next` 引用列表中的下一个节点.
|
|
|
|
|
- `previous`引用列表中的上一个节点.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
list.addTailMany([ 0, 1, 2 ]);
|
|
|
|
|
|
|
|
|
|
console.log(
|
|
|
|
|
list.head.value, // 0
|
|
|
|
|
list.head.next.value, // 1
|
|
|
|
|
list.head.next.next.value, // 2
|
|
|
|
|
list.head.next.next.previous.value, // 1
|
|
|
|
|
list.head.next.next.previous.previous.value, // 0
|
|
|
|
|
list.tail.value, // 2
|
|
|
|
|
list.tail.previous.value, // 1
|
|
|
|
|
list.tail.previous.previous.value, // 0
|
|
|
|
|
list.tail.previous.previous.next.value, // 1
|
|
|
|
|
list.tail.previous.previous.next.next.value, // 2
|
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Types
|
|
|
|
|
|
|
|
|
|
#### ListMapperFn
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
type ListMapperFn<T = any> = (value: T) => any;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该函数在 `toString` 方法中用于在生成列表的字符串形式之前映射节点值.
|
|
|
|
|
|
|
|
|
|
#### ListComparisonFn
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
type ListComparisonFn<T = any> = (nodeValue: T, comparedValue: any) => boolean;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该函数用于根据比较值添加,删除和查找节点.
|
|
|
|
|
|
|
|
|
|
#### ListIteratorFn
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
type ListIteratorFn<T = any, R = boolean> = (
|
|
|
|
|
node: ListNode<T>,
|
|
|
|
|
index?: number,
|
|
|
|
|
list?: LinkedList,
|
|
|
|
|
) => R;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该函数在遍历列表时使用,可以对每个节点执行某些操作,也可以查找某个节点.
|