Make it possible to use custom comparators for linked lists.

This commit is contained in:
Oleksii Trekhleb 2018-05-11 16:30:28 +03:00
parent 670ec093f4
commit 1af824f448
2 changed files with 37 additions and 5 deletions

View File

@ -1,12 +1,18 @@
import LinkedListNode from './LinkedListNode'; import LinkedListNode from './LinkedListNode';
import Comparator from '../../utils/comparator/Comparator';
export default class LinkedList { export default class LinkedList {
constructor() { /**
* @param {Function} [comparatorFunction]
*/
constructor(comparatorFunction) {
/** @var LinkedListNode */ /** @var LinkedListNode */
this.head = null; this.head = null;
/** @var LinkedListNode */ /** @var LinkedListNode */
this.tail = null; this.tail = null;
this.compare = new Comparator(comparatorFunction);
} }
/** /**
@ -54,7 +60,7 @@ export default class LinkedList {
let deletedNode = null; let deletedNode = null;
// If the head must be deleted then make 2nd node to be a head. // If the head must be deleted then make 2nd node to be a head.
if (this.head.value === value) { if (this.compare.equal(this.head.value, value)) {
deletedNode = this.head; deletedNode = this.head;
this.head = this.head.next; this.head = this.head.next;
} }
@ -63,7 +69,7 @@ export default class LinkedList {
// If next node must be deleted then make next node to be a next next one. // If next node must be deleted then make next node to be a next next one.
while (currentNode.next) { while (currentNode.next) {
if (currentNode.next.value === value) { if (this.compare.equal(currentNode.next.value, value)) {
deletedNode = currentNode.next; deletedNode = currentNode.next;
currentNode.next = currentNode.next.next; currentNode.next = currentNode.next.next;
} else { } else {
@ -72,7 +78,7 @@ export default class LinkedList {
} }
// Check if tail must be deleted. // Check if tail must be deleted.
if (this.tail.value === value) { if (this.compare.equal(this.tail.value, value)) {
this.tail = currentNode; this.tail = currentNode;
} }
@ -99,7 +105,7 @@ export default class LinkedList {
} }
// If value is specified then try to compare by value.. // If value is specified then try to compare by value..
if (value !== undefined && currentNode.value === value) { if (value !== undefined && this.compare.equal(currentNode.value, value)) {
return currentNode; return currentNode;
} }

View File

@ -175,4 +175,30 @@ describe('LinkedList', () => {
expect(node.value.key).toBe('test2'); expect(node.value.key).toBe('test2');
expect(linkedList.find({ callback: value => value.key === 'test5' })).toBeNull(); expect(linkedList.find({ callback: value => value.key === 'test5' })).toBeNull();
}); });
it('should find node by means of custom compare function', () => {
const comparatorFunction = (a, b) => {
if (a.customValue === b.customValue) {
return 0;
}
return a.customValue < b.customValue ? -1 : 1;
};
const linkedList = new LinkedList(comparatorFunction);
linkedList
.append({ value: 1, customValue: 'test1' })
.append({ value: 2, customValue: 'test2' })
.append({ value: 3, customValue: 'test3' });
const node = linkedList.find({
value: { value: 2, customValue: 'test2' },
});
expect(node).toBeDefined();
expect(node.value.value).toBe(2);
expect(node.value.customValue).toBe('test2');
expect(linkedList.find({ value: 2, customValue: 'test5' })).toBeNull();
});
}); });