Answer
t.me/js_testОтвет:
function* getReverseListValues(list) {
if (list.next) {
yield* getReverseListValues(list.next);
}
yield list.value;
}
function* getReverseListValues(list) {
const arr = [];
let tmp = list;
while (tmp) {
arr.push(tmp.value);
tmp = tmp.next;
}
for (let i = arr.length - 1; i >= 0; i--) {
yield arr[i];
}
}
Объяснение:
Данную задачу можно решить двумя способами, использовать рекурсию или использовать цикл. В первом случае нужно проверить есть ли в текущей ноде поле next и если есть то продолжить рекурсию с помощью оператора yield*, так наш код дойдёт до последней ноды и начнёт выводить значения с конца. Во втором случае нужно создать массив и сложить в него все значения в нормальном порядке, а возвращать эти значения уже в обратном порядке.
Код для проверки:
const linkedList = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null,
},
},
},
};
function* getReverseListValues1(list) {
if (list.next) {
yield* getReverseListValues1(list.next);
}
yield list.value;
}
function* getReverseListValues2(list) {
const arr = [];
let tmp = list;
while (tmp) {
arr.push(tmp.value);
tmp = tmp.next;
}
for (let i = arr.length - 1; i >= 0; i--) {
yield arr[i];
}
}
console.log(...getReverseListValues1(linkedList));
console.log(...getReverseListValues2(linkedList));