Files

217 lines
5.5 KiB
Markdown
Raw Permalink Normal View History

---
id: 587d825a367417b2b2512c87
title: Створення двобічно зв'язаного списку
challengeType: 1
forumTopicId: 301626
dashedName: create-a-doubly-linked-list
---
# --description--
Всі зв'язані списки, які ми створювали до цього, були однобічними. Тут ми створимо <dfn>двобічний зв'язаний список</dfn>. Як випливає з назви, вузли у двобічно зв'язаному списку мають посилання на наступний і попередній вузол у списку.
Це дозволяє нам обходити список в обох напрямках. Але також для цього потрібно більше пам'яті, оскільки кожен вузол повинен містити додаткове посилання на попередній вузол у списку.
# --instructions--
Ми задали об'єкт `Node` і почали наш `DoublyLinkedList`. Додаймо до нашого двобічно зв'язаного списку два методи під назвами `add` і `remove`. Метод `add` повинен додавати вказаний елемент до списку, а метод `remove` - видаляти всі входження заданого елемента у списку.
Під час написання цих методів будьте уважні з обробкою будь-яких можливих граничних випадків, як-от видалення першого чи останнього елементу. Крім того, спроба видалення будь-якого елементу з порожнього списку має повертатися як `null`.
# --hints--
Повинна існувати структура даних DoublyLinkedList.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
return typeof test == 'object';
})()
);
```
У DoublyLinkedList повинен бути метод add.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
if (test.add == undefined) {
return false;
}
return typeof test.add == 'function';
})()
);
```
У DoublyLinkedList повинен бути метод remove.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
if (test.remove == undefined) {
return false;
}
return typeof test.remove == 'function';
})()
);
```
Спроба видалення елементу з пустого списку має повертатися як null.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
return test.remove(100) == null;
})()
);
```
Метод add має додавати елементи до списку.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
test.add(5);
test.add(6);
test.add(723);
return test.print().join('') == '56723';
})()
);
```
Кожен вузол повинен відстежувати попередній вузол.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
test.add(50);
test.add(68);
test.add(73);
return test.printReverse().join('') == '736850';
})()
);
```
Повинна бути можливість видалити зі списку перший елемент.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
test.add(25);
test.add(35);
test.add(60);
test.remove(25);
return test.print().join('') == '3560';
})()
);
```
Повинна бути можливість видалити зі списку останній елемент.
```js
assert(
(function () {
var test = false;
if (typeof DoublyLinkedList !== 'undefined') {
test = new DoublyLinkedList();
}
test.add(25);
test.add(35);
test.add(60);
test.remove(60);
return test.print().join('') == '2535';
})()
);
```
# --seed--
## --after-user-code--
```js
DoublyLinkedList.prototype = Object.assign(
DoublyLinkedList.prototype,
{
print() {
if (this.head == null) {
return null;
} else {
var result = new Array();
var node = this.head;
while (node.next != null) {
result.push(node.data);
node = node.next;
};
result.push(node.data);
return result;
};
},
printReverse() {
if (this.tail == null) {
return null;
} else {
var result = new Array();
var node = this.tail;
while (node.prev != null) {
result.push(node.data);
node = node.prev;
};
result.push(node.data);
return result;
};
}
});
```
## --seed-contents--
```js
var Node = function(data, prev) {
this.data = data;
this.prev = prev;
this.next = null;
};
var DoublyLinkedList = function() {
this.head = null;
this.tail = null;
// Only change code below this line
// Only change code above this line
};
```
# --solutions--
```js
// solution required
```