diff --git a/README.md b/README.md index 90873021..02f38250 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Collection of interview questions with Unit Tests. Problems includes Data Struct - [N Element From Last](src/_DataStructures_/LinkedList/element-from-last) - [Middle Node](src/_DataStructures_/LinkedList/middle-node) - [Detect Loop](src/_DataStructures_/LinkedList/loop-in-list) + - [Reverse Linked List](src/_DataStructures_/LinkedList/reverse-linked-list) - [Stack](src/_DataStructures_/Stack) - [Implement Queue Using Stack](src/_DataStructures_/Stack/immitate-queue-using-stack) - [Baseball Game](src/_DataStructures_/Stack/baseball-game) diff --git a/src/_DataStructures_/LinkedList/reverse-linked-list/index.js b/src/_DataStructures_/LinkedList/reverse-linked-list/index.js new file mode 100644 index 00000000..11dd4d50 --- /dev/null +++ b/src/_DataStructures_/LinkedList/reverse-linked-list/index.js @@ -0,0 +1,15 @@ +function reverseLinkedList(linkedList) { + let next = linkedList.getFirst(); + let current = null; + let prev; + while(next != null){ + prev = current; + current = next; + next = next.next; + current.next = prev; + } + return current; +}; +module.exports = { + reverseLinkedList, + }; diff --git a/src/_DataStructures_/LinkedList/reverse-linked-list/reverse-linked-list.test.js b/src/_DataStructures_/LinkedList/reverse-linked-list/reverse-linked-list.test.js new file mode 100644 index 00000000..eba6c5d8 --- /dev/null +++ b/src/_DataStructures_/LinkedList/reverse-linked-list/reverse-linked-list.test.js @@ -0,0 +1,37 @@ +const { LinkedList } = require('../index'); +const { reverseLinkedList } = require('.'); + +describe('Reverse a LinkedList', () => { + let list = null; + beforeEach(() => { + list = new LinkedList(); + list.addAtBeginning('1'); + list.addAtEnd('2'); + list.addAtEnd('3'); + list.addAtEnd('4'); + list.addAtEnd('5'); + }); + + it('Should return `null` for empty list', () => { + list.delete(); + expect(reverseLinkedList(list)).toEqual(null); + }); + + it('Should return `5`->`4`->`3`->`2`->`1` for the given list', () => { + let reversedList = reverseLinkedList(list); + expect(reversedList.data).toEqual('5'); + expect(reversedList.next.data).toEqual('4'); + expect(reversedList.next.next.data).toEqual('3'); + expect(reversedList.next.next.next.data).toEqual('2'); + expect(reversedList.next.next.next.next.data).toEqual('1'); + }); + + it('Should return `3`->`2`->`1` after deleting 2 last nodes of the list', () => { + list.removeFromEnd(); + list.removeFromEnd(); + let reversedList2 = reverseLinkedList(list); + expect(reversedList2.data).toEqual('3'); + expect(reversedList2.next.data).toEqual('2'); + expect(reversedList2.next.next.data).toEqual('1'); + }); +});