我有一个有趣的任务。我解决了一半,但无法找到解决剩下的问题的解决方案。希望有人能指出我正确的方向。
我发现solution接近我的任务。但我的略有不同,使用ES6。
有嵌套对象。
let someList = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
我收到了所有的价值观。
function reversePrint(linkedList) {
Object.keys(linkedList).map(key => {
let myKey = linkedList[key];
typeof myKey == "object" ? console.log(reversePrint(myKey)) : console.log(myKey);
});
}
reversePrint(someList);
但问题是:我如何以相反的顺序获得所有值?
小提琴:https://jsfiddle.net/L83puqbz/17/
我尝试使用reduce来制作数组并将其反转,但每个值都在单独的数组中。
小提琴https://jsfiddle.net/L83puqbz/20/
任何帮助都会受到极大关注。
答案 0 :(得分:5)
编辑 - 抱歉是的,更多解释。
以下代码将浏览链接列表并以相反的顺序打印值。
由于日志是在递归调用之后,因此在控制台日志开始之前,这将一直到最后一个节点。然后在每个控制台日志之后,堆栈中的当前函数将结束,允许前一个函数继续打印。
let someList = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
function printAfter(node){
if(node.next != null){
printAfter(node.next);
}
console.log(node.value);
}
printAfter(someList)
答案 1 :(得分:3)
正如其他人所建议的那样,你可以通过递归来做到这一点。
function reverse(node) {
return (node.next === null) ? [node.value] : [...reverse(node.next), node.value];
}
或者,你可以使用一个简单的循环:
function reversedValues(node) {
const values = [];
while (node !== null) {
values.unshift(node.value);
node = node.next;
}
return values;
}
第一种解决方案的优点是简洁和优雅。缺点是,如果您的链表非常庞大,它可能会导致堆栈溢出。第二种解决方案更加笨拙和冗长,但它不容易出现堆栈溢出。