211 lines
4.9 KiB
Markdown
211 lines
4.9 KiB
Markdown
![]() |
---
|
||
|
id: 587d8251367417b2b2512c63
|
||
|
title: Remove Elements from a Linked List
|
||
|
challengeType: 1
|
||
|
forumTopicId: 301712
|
||
|
dashedName: remove-elements-from-a-linked-list
|
||
|
---
|
||
|
|
||
|
# --description--
|
||
|
|
||
|
The next important method that any implementation of a linked list will need is a `remove` method. This method should take the element we want to remove as an argument, and then search the list to find and remove the node that contains that element.
|
||
|
|
||
|
Whenever we remove a node from a linked list, it's important that we don't accidentally orphan the rest of the list in doing so. Recall that every node's `next` property points to the node that follows it in the list. If we're removing the middle element, say, we'll want to make sure that we have a connection from that element's previous node's `next` property to the middle element's `next` property (which is the next node in the list!)
|
||
|
|
||
|
This might sound really confusing, so let's return to the conga line example so we have a good conceptual model. Picture yourself in a conga line, and the person directly in front of you leaves the line. The person who just left the line no longer has her hands on anyone in line--and you no longer have your hands on the person that left. You step forward and put your hands on next person you see.
|
||
|
|
||
|
If the element we wish to remove is the `head` element, we reassign the `head` to the second node of the linked list.
|
||
|
|
||
|
# --instructions--
|
||
|
|
||
|
Write a `remove` method that takes an element and removes it from the linked list.
|
||
|
|
||
|
**Note:** The `length` of the list should decrease by one every time an element is removed from the linked list.
|
||
|
|
||
|
# --hints--
|
||
|
|
||
|
Your `LinkedList` class should have a `remove` method.
|
||
|
|
||
|
```js
|
||
|
assert(
|
||
|
(function () {
|
||
|
var test = new LinkedList();
|
||
|
return typeof test.remove === 'function';
|
||
|
})()
|
||
|
);
|
||
|
```
|
||
|
|
||
|
Your `remove` method should reassign `head` to the second node when the first node is removed.
|
||
|
|
||
|
```js
|
||
|
assert(
|
||
|
(function () {
|
||
|
var test = new LinkedList();
|
||
|
test.add('cat');
|
||
|
test.add('dog');
|
||
|
test.remove('cat');
|
||
|
return test.head().element === 'dog';
|
||
|
})()
|
||
|
);
|
||
|
```
|
||
|
|
||
|
Your `remove` method should decrease the `length` of the linked list by one for every node removed.
|
||
|
|
||
|
```js
|
||
|
assert(
|
||
|
(function () {
|
||
|
var test = new LinkedList();
|
||
|
test.add('cat');
|
||
|
test.add('dog');
|
||
|
test.add('hamster');
|
||
|
test.remove('cat');
|
||
|
test.remove('fish');
|
||
|
return test.size() === 2;
|
||
|
})()
|
||
|
);
|
||
|
```
|
||
|
|
||
|
Your `remove` method should reassign the reference of the previous node of the removed node to the removed node's `next` reference.
|
||
|
|
||
|
```js
|
||
|
assert(
|
||
|
(function () {
|
||
|
var test = new LinkedList();
|
||
|
test.add('cat');
|
||
|
test.add('dog');
|
||
|
test.add('snake');
|
||
|
test.add('kitten');
|
||
|
test.remove('snake');
|
||
|
return test.head().next.next.element === 'kitten';
|
||
|
})()
|
||
|
);
|
||
|
```
|
||
|
|
||
|
Your `remove` method should not change the linked list if the element does not exist in the linked list.
|
||
|
|
||
|
```js
|
||
|
assert(
|
||
|
(function () {
|
||
|
var test = new LinkedList();
|
||
|
test.add('cat');
|
||
|
test.add('dog');
|
||
|
test.add('kitten');
|
||
|
test.remove('elephant');
|
||
|
return (
|
||
|
JSON.stringify(test.head()) ===
|
||
|
'{"element":"cat","next":{"element":"dog","next":{"element":"kitten","next":null}}}'
|
||
|
);
|
||
|
})()
|
||
|
);
|
||
|
```
|
||
|
|
||
|
# --seed--
|
||
|
|
||
|
## --seed-contents--
|
||
|
|
||
|
```js
|
||
|
function LinkedList() {
|
||
|
var length = 0;
|
||
|
var head = null;
|
||
|
|
||
|
var Node = function(element){
|
||
|
this.element = element;
|
||
|
this.next = null;
|
||
|
};
|
||
|
|
||
|
this.size = function(){
|
||
|
return length;
|
||
|
};
|
||
|
|
||
|
this.head = function(){
|
||
|
return head;
|
||
|
};
|
||
|
|
||
|
this.add = function(element){
|
||
|
var node = new Node(element);
|
||
|
if(head === null){
|
||
|
head = node;
|
||
|
} else {
|
||
|
var currentNode = head;
|
||
|
|
||
|
while(currentNode.next){
|
||
|
currentNode = currentNode.next;
|
||
|
}
|
||
|
|
||
|
currentNode.next = node;
|
||
|
}
|
||
|
|
||
|
length++;
|
||
|
};
|
||
|
|
||
|
this.remove = function(element){
|
||
|
// Only change code below this line
|
||
|
|
||
|
// Only change code above this line
|
||
|
};
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# --solutions--
|
||
|
|
||
|
```js
|
||
|
function LinkedList() {
|
||
|
var length = 0;
|
||
|
var head = null;
|
||
|
|
||
|
var Node = function(element){
|
||
|
this.element = element;
|
||
|
this.next = null;
|
||
|
};
|
||
|
|
||
|
this.size = function(){
|
||
|
return length;
|
||
|
};
|
||
|
|
||
|
this.head = function(){
|
||
|
return head;
|
||
|
};
|
||
|
|
||
|
this.add = function(element){
|
||
|
var node = new Node(element);
|
||
|
if(head === null){
|
||
|
head = node;
|
||
|
} else {
|
||
|
var currentNode = head;
|
||
|
|
||
|
while(currentNode.next){
|
||
|
currentNode = currentNode.next;
|
||
|
}
|
||
|
|
||
|
currentNode.next = node;
|
||
|
}
|
||
|
|
||
|
length++;
|
||
|
};
|
||
|
|
||
|
this.remove = function(element){
|
||
|
if (head === null) {
|
||
|
return;
|
||
|
}
|
||
|
var previous;
|
||
|
var currentNode = head;
|
||
|
|
||
|
while (currentNode.next !== null && currentNode.element !== element) {
|
||
|
previous = currentNode;
|
||
|
currentNode = currentNode.next;
|
||
|
}
|
||
|
|
||
|
if (currentNode.next === null && currentNode.element !== element) {
|
||
|
return;
|
||
|
}
|
||
|
else if (previous) {
|
||
|
previous.next = currentNode.next;
|
||
|
} else {
|
||
|
head = currentNode.next;
|
||
|
}
|
||
|
|
||
|
length--;
|
||
|
};
|
||
|
}
|
||
|
```
|