From 6f27113993cc53f988175ac6e3ca9368f3e1a1a9 Mon Sep 17 00:00:00 2001 From: Oleksii Trekhleb Date: Sat, 8 Sep 2018 22:25:23 +0300 Subject: [PATCH] Add reverse() method for doubly linked list. --- .../doubly-linked-list/DoublyLinkedList.js | 28 +++++++++++++++++++ .../__test__/DoublyLinkedList.test.js | 26 +++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/data-structures/doubly-linked-list/DoublyLinkedList.js b/src/data-structures/doubly-linked-list/DoublyLinkedList.js index 4afb404b..e66e016d 100644 --- a/src/data-structures/doubly-linked-list/DoublyLinkedList.js +++ b/src/data-structures/doubly-linked-list/DoublyLinkedList.js @@ -230,4 +230,32 @@ export default class DoublyLinkedList { toString(callback) { return this.toArray().map(node => node.toString(callback)).toString(); } + + /** + * Reverse a linked list. + * @returns {DoublyLinkedList} + */ + reverse() { + let currNode = this.head; + let prevNode = null; + let nextNode = null; + + while (currNode) { + // Store next node. + nextNode = currNode.next; + + // Change next node of the current node so it would link to previous node. + currNode.next = prevNode; + + // Move prevNode and currNode nodes one step forward. + prevNode = currNode; + currNode = nextNode; + } + + // Reset head and tail. + this.tail = this.head; + this.head = prevNode; + + return this; + } } diff --git a/src/data-structures/doubly-linked-list/__test__/DoublyLinkedList.test.js b/src/data-structures/doubly-linked-list/__test__/DoublyLinkedList.test.js index 5e4e81ea..ca6be64f 100644 --- a/src/data-structures/doubly-linked-list/__test__/DoublyLinkedList.test.js +++ b/src/data-structures/doubly-linked-list/__test__/DoublyLinkedList.test.js @@ -228,4 +228,30 @@ describe('DoublyLinkedList', () => { expect(node.value.customValue).toBe('test2'); expect(linkedList.find({ value: 2, customValue: 'test5' })).toBeNull(); }); + + it('should reverse linked list', () => { + const linkedList = new DoublyLinkedList(); + + // Add test values to linked list. + linkedList + .append(1) + .append(2) + .append(3); + + expect(linkedList.toString()).toBe('1,2,3'); + expect(linkedList.head.value).toBe(1); + expect(linkedList.tail.value).toBe(3); + + // 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); + }); });