diff --git a/src/linkedList.d.ts b/src/linkedList.d.ts index 4b05a2f..656fb27 100644 --- a/src/linkedList.d.ts +++ b/src/linkedList.d.ts @@ -21,4 +21,5 @@ export class LinkedList { isEmpty(): boolean; clear(): void; static fromArray(values: (T extends LinkedListNode ? T : LinkedListNode)[]): LinkedList; + reverse(): LinkedList; } diff --git a/src/linkedList.js b/src/linkedList.js index eb65032..5b60b36 100644 --- a/src/linkedList.js +++ b/src/linkedList.js @@ -340,6 +340,30 @@ class LinkedList { }); return linkedList; } -} + /** + * Reverses the linked list in-place. + * @public + * @returns {LinkedList} + */ + reverse() { + if (this.isEmpty() || !this._head.hasNext()) { + return this; // no change needed + } + let prev = null; + let current = this._head; + let next = null; + + while (current instanceof LinkedListNode) { + next = current.getNext(); // store next + current.setNext(prev); // reverse pointer + prev = current; // move prev + current = next; // move current + } + + this._head = prev; + return this; + } + +} exports.LinkedList = LinkedList; diff --git a/test/linkedList.test.js b/test/linkedList.test.js index 9b7dc01..e6ef832 100644 --- a/test/linkedList.test.js +++ b/test/linkedList.test.js @@ -215,4 +215,35 @@ describe('linkedList tests', () => { ]); }); }); + + describe('.reverse()', () => { + it('reverse the linked list order', () => { + const list = new LinkedList(); + list.insertLast(1); + list.insertLast(2); + list.insertLast(3); + list.insertLast(4); + + list.reverse(); + + expect(list.toArray().map(n => n.getValue())) + .to.deep.equal([4, 3, 2, 1]); + }); + + it('reverse an empty list', () => { + const list = new LinkedList(); + list.reverse(); + expect(list.toArray()).to.deep.equal([]); + }); + + it('reverse a single-node list', () => { + const list = new LinkedList(); + list.insertLast(99); + list.reverse(); + + expect(list.toArray().map(n => n.getValue())) + .to.deep.equal([99]); + }); +}); + });