mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2026-03-13 08:51:02 +08:00
Move linked list traversals into separate section.
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user