Move linked list traversals into separate section.

This commit is contained in:
Oleksii Trekhleb
2018-09-08 22:20:52 +03:00
parent 2feec48ea6
commit 80ecbe0b3e
9 changed files with 147 additions and 60 deletions

View File

@@ -208,40 +208,6 @@ export default class LinkedList {
return this.toArray().map(node => node.toString(callback)).toString();
}
/**
* Traverse through all nodes of the list from head to tail
* @param {*} callback
* @return {LinkedListNode[]}
*/
traverse(callback = undefined) {
if (typeof callback !== 'function') {
throw new TypeError(`traverse method requires a callback function as an argument.\nArgument given: ${typeof callback}`);
}
let currentNode = this.head;
const traversedNodes = [];
while (currentNode) {
traversedNodes.push(callback(currentNode.value));
currentNode = currentNode.next;
}
return traversedNodes;
}
/**
* The items in the list have been traversed in reverse order
*/
reverseTraversal(node, callback = undefined) {
if (typeof callback !== 'function') {
throw new TypeError(`reverseTraverse method requires a callback function as an argument.\nArgument given: ${typeof callback}`);
}
if (!node) return [];
return this.reverseTraversal(node.next, callback).concat(callback(node.value));
}
/**
* Reverse a linked list.
* @returns {LinkedList}

View File

@@ -218,31 +218,6 @@ describe('LinkedList', () => {
expect(linkedList.find({ value: 2, customValue: 'test5' })).toBeNull();
});
it('should traverse through all nodes of the list from head to tail with callback', () => {
const linkedList = new LinkedList();
linkedList
.append(1)
.append(2)
.append(3);
expect(linkedList.traverse(value => value * 2)).toEqual([2, 4, 6]);
expect(() => linkedList.traverse()).toThrow();
});
it('should reverse traversal the linked list with callback', () => {
const linkedList = new LinkedList();
linkedList
.append(1)
.append(2)
.append(3);
expect(linkedList.toString()).toBe('1,2,3');
expect(linkedList.reverseTraversal(linkedList.head, value => value * 2)).toEqual([6, 4, 2]);
expect(() => linkedList.reverseTraversal(linkedList.head)).toThrow();
});
it('should reverse linked list', () => {
const linkedList = new LinkedList();
@@ -258,9 +233,14 @@ describe('LinkedList', () => {
// Reverse linked list.
linkedList.reverse();
expect(linkedList.toString()).toBe('3,2,1');
expect(linkedList.head.value).toBe(3);
expect(linkedList.tail.value).toBe(1);
// Reverse linked list back to initial state.
linkedList.reverse();
expect(linkedList.toString()).toBe('1,2,3');
expect(linkedList.head.value).toBe(1);
expect(linkedList.tail.value).toBe(3);
});
});