Skip to content

Commit 07eb1be

Browse files
Raziyehbazargandawsbot
authored andcommitted
➕ chapter-2: Delete middle node of SLL (careercup#5)
* find middle node of a Singly Linked List * find middle node of a Singly Linked List * find middle node of a Singly Linked List * add find-middle node tests * Delete middle Node of Linked List * correct2-3-Delete Middle Node * add solution for access to the head / or access to middle-node * 2-2: rturn Kth to Last * add for loop for craating new node in beforeEach for tests * 2-8: Detection Loop in SLL
1 parent 9483319 commit 07eb1be

File tree

8 files changed

+202
-3
lines changed

8 files changed

+202
-3
lines changed

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
## Question List:
66

7-
#### Chapter 1
7+
#### Chapter 1
88
- [x] 1.1 - [Is Unique](lib/data-structures/chapter-1/1_1.js)
99
- [x] 1.2 - [Check Permutation](lib/data-structures/chapter-1/1_2.js)
1010
- [x] 1.3 - [URLify](lib/data-structures/chapter-1/1_3.js)
@@ -13,7 +13,13 @@
1313
- [x] 1.6 - [String Compression](lib/data-structures/chapter-1/1_6.js)
1414
- [x] 1.7 - [Rotate Matrix](lib/data-structures/chapter-1/1_7.js)
1515
- [x] 1.8 - [Zero Matrix](lib/data-structures/chapter-1/1_8.js)
16-
- [ ] 1.9 - String Rotation
16+
- [ ] 1.9 - String Rotation
17+
18+
#### Chapter 2
19+
- [x] 2.2 - [Return Kth to Last](lib/data-structures/chapter-2/2_2.js)
20+
- [x] 2.3 - [Delete Middle Node](lib/data-structures/chapter-2/2_3.js)
21+
- [x] 2.8 - [Detection Loop](lib/data-structures/chapter-2/2_8.js)
22+
1723

1824
#### Chapter 3
1925
- [ ] 3.1 - Three in One
@@ -38,7 +44,7 @@ npm install
3844
npm test
3945
```
4046

41-
If you just want to lint
47+
If you just want to lint
4248
```bash
4349
npm run lint
4450
```
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
var SLL = require('./helper.js');
2+
3+
SLL.prototype.nthToLast = function(head, k) {
4+
var p1 = head,
5+
p2 = head;
6+
7+
for (var i = 0; i < k; i++) {
8+
if (p1 === null) {
9+
return null;
10+
}
11+
p1 = p1.next;
12+
}
13+
14+
while(p1 !== null) {
15+
p1 = p1.next;
16+
p2 = p2.next;
17+
}
18+
return p2;
19+
};
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
var SLL = require('./helper.js');
2+
3+
function Node(data, next) {
4+
this.data = data,
5+
this.next = next;
6+
}
7+
8+
SLL.prototype.addNode = function(data, next) {
9+
var node = new Node(data, next),
10+
current = this.head;
11+
12+
if (this.head === null) {
13+
this.head = node;
14+
this.length++;
15+
return;
16+
}
17+
while (current.next) {
18+
current = current.next;
19+
}
20+
current.next = node;
21+
this.length++;
22+
};
23+
24+
//solution for delete middle node with access to the head of LinkedList
25+
SLL.prototype.findMiddleAndRemove = function(head) {
26+
( head === null || head.next === null ) ? null : head;
27+
28+
var slowPointer = head,
29+
fastPointer = head,
30+
previous = null;
31+
32+
while(fastPointer.next !== null && fastPointer.next.next !== null) {
33+
fastPointer = fastPointer.next.next;
34+
previous = slowPointer;
35+
slowPointer = slowPointer.next;
36+
}
37+
38+
previous.next = slowPointer.next;
39+
this.length--;
40+
};
41+
42+
//solution for delete middle node with access to the node ( middle node ) not the head of LinkedList
43+
SLL.prototype.removeMiddleNode = function(currentNode) {
44+
if ( currentNode === null || currentNode.next === null) {
45+
return false;
46+
}
47+
//copy next node data to current node
48+
var nextNode = currentNode.next;
49+
currentNode.data = nextNode.data;
50+
currentNode.next = nextNode.next;
51+
52+
//remove next node
53+
currentNode.next = nextNode.next;
54+
this.length--;
55+
};
56+
57+
//return MyLinkedList;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
var SLL = require('./helper.js');
2+
3+
SLL.prototype.findBeginning = function(head) {
4+
var slow = head,
5+
fast = head;
6+
7+
//find meeting point
8+
while (fast !== null && fast.next !== null) {
9+
slow = slow.next;
10+
fast = fast.next.next;
11+
if (slow === fast) {
12+
break;
13+
}
14+
}
15+
16+
// no loop
17+
if (fast === null || fast.next === null) {
18+
return null;
19+
}
20+
21+
// move slow to head. keep fast at meeting point. if they move at the same pace, they must meet at the loop start.
22+
slow = head;
23+
while (slow !== fast) {
24+
slow = slow.next;
25+
fast = fast.next;
26+
}
27+
return fast;
28+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = MyLinkedList = (function(){
2+
3+
function MyLinkedList() {
4+
this.head = null;
5+
this.length = 0;
6+
}
7+
8+
return MyLinkedList;
9+
})();
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
require('../../test_helper');
2+
3+
describe('2.2 #nthToLast', function () {
4+
describe('return Kth element to last', function () {
5+
var sll;
6+
beforeEach(function() {
7+
sll = new MyLinkedList();
8+
for(var i=1; i < 6; i++) {
9+
sll.addNode( i + 'Node', null);
10+
}
11+
});
12+
13+
afterEach(function() {
14+
sll = null;
15+
});
16+
17+
it('should return Kth element to last', function () {
18+
var kthNode = sll.nthToLast(sll.head, 3);
19+
expect(kthNode).to.not.be.null;
20+
expect(kthNode).to.have.property('data').and.be.equal('3Node');
21+
});
22+
});
23+
});
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require('../../test_helper');
2+
3+
describe('2.3 #FindMiddle', function () {
4+
describe('return middle Node', function () {
5+
var sll;
6+
beforeEach(function() {
7+
sll = new MyLinkedList();
8+
for(var i=1; i < 6; i++) {
9+
sll.addNode( i + 'Node', null);
10+
}
11+
});
12+
13+
afterEach(function() {
14+
sll = null;
15+
});
16+
17+
it('should return correct length of LinkedList', function () {
18+
expect(sll).length.to.be(5);
19+
});
20+
21+
it('should remove the middle node with aceess to the head of SLL', function () {
22+
sll.findMiddleAndRemove(sll.head);
23+
expect(sll).length.to.be(4);
24+
});
25+
26+
it('should remove the middle node with access to the middle_node not head', function () {
27+
sll.removeMiddleNode(sll.head.next.next);
28+
expect(sll).length.to.be(4);
29+
});
30+
31+
});
32+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
require('../../test_helper');
2+
3+
describe('2.8 #findBeginning', function () {
4+
describe('find loop in Singly Linkedlist', function () {
5+
var sll;
6+
beforeEach(function() {
7+
sll = new MyLinkedList();
8+
for(var i=1; i < 6; i++) {
9+
sll.addNode( i + 'Node', null);
10+
}
11+
//create loop in linkedlist
12+
sll.addNode('6Node', sll.head.next.next.next);
13+
});
14+
15+
afterEach(function() {
16+
sll = null;
17+
});
18+
19+
it('should return loop start (node) in SLL', function () {
20+
var loopPoint = sll.findBeginning(sll.head);
21+
expect(loopPoint).not.be.null;
22+
expect(loopPoint).to.have.property('data').and.be.equal('4Node');
23+
});
24+
});
25+
});

0 commit comments

Comments
 (0)