Skip to content

Commit

Permalink
feat(LinkedList): support remove node via index
Browse files Browse the repository at this point in the history
  • Loading branch information
sun0day committed Oct 21, 2022
1 parent 6c9ac94 commit 7ad23b1
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 8 deletions.
4 changes: 2 additions & 2 deletions packages/linked-list/README.md
Expand Up @@ -169,10 +169,10 @@ declare class LinkedList<T> {
/**
* remove node, T = O(n)
*
* @param {LinkedListNode<T>) => boolean} compare - node which matches `compare` will be removed
* @param {(node: LinkedListNode<T>, index: number) => boolean} compare - node which matches `compare` will be removed
* @returns {LinkedListNode<T> | null} - return removed node, if node not exist, return null
*/
remove(compare: (node: LinkedListNode<T>) => boolean): LinkedListNode<T>;
remove(compare: (node: LinkedListNode<T>, index: number) => boolean): LinkedListNode<T>;
/**
* reverse a linked list, T = O(n)
*
Expand Down
4 changes: 2 additions & 2 deletions packages/linked-list/index.test.ts
Expand Up @@ -90,15 +90,15 @@ describe('LinkedList', () => {
expect(list.size()).toBe(2)
expect(list.toArray()).toEqual([2, 4])

removed = list.remove(node => node.value === 4)
removed = list.remove((node, index) => index === 1)
expect(removed.value).toBe(4)
expect(removed.next).toBe(null)
expect(list.head().value).toBe(2)
expect(list.tail().value).toBe(2)
expect(list.size()).toBe(1)
expect(list.toArray()).toEqual([2])

removed = list.remove(node => node.value === 2)
removed = list.remove((node, index) => index === 0)
expect(removed.value).toBe(2)
expect(removed.next).toBe(null)
expect(list.head()).toBeNull()
Expand Down
9 changes: 5 additions & 4 deletions packages/linked-list/index.ts
Expand Up @@ -139,22 +139,23 @@ export class LinkedList<T> {
/**
* remove node, T = O(n)
*
* @param {LinkedListNode<T>) => boolean} compare - node which matches `compare` will be removed
* @param {(node: LinkedListNode<T>, index: number) => boolean} compare - node which matches `compare` will be removed
* @returns {LinkedListNode<T> | null} - return removed node, if node not exist, return null
*/
remove(compare: (node: LinkedListNode<T>) => boolean) {
remove(compare: (node: LinkedListNode<T>, index: number) => boolean) {
const shadowHead = new LinkedListNode(null, this._head)
let count = 0
let index = -1
let prev = shadowHead
let cur = prev

while (cur) {
// should ignore shadow head
if (count++ > 0 && compare(cur))
if (index > -1 && compare(cur, index))
break

prev = cur
cur = cur.next
index++
}

if (!cur)
Expand Down

0 comments on commit 7ad23b1

Please sign in to comment.