寻求帮助来解决此递归问题:给定一个不确定长度的链表,该链表由存储对下一个节点的引用的节点组成。...如何反向返回该列表?
例如,节点A-> B-> C-> D应该返回D-> C-> B-> A。该函数被赋予任何节点,并且应该反向返回该列表。
一个节点将由几个值组成;一个整数(i)和一个 next 属性,该属性是指向下一个节点的指针。
const traverseList = (node) => {
if(node.next !== null) traverseList(node);
else return;
}
我正在尝试此代码,但无法正常工作。请只寻找丢失的部分。谢谢你的帮助。
答案 0 :(得分:3)
您在正确的路径上,只需在从每个节点返回时打印它即可。
const traverseList = (node) => {
if (!node) return;
traverseList(node.next);
console.log(node.value); // or whatever you want to output
}
答案 1 :(得分:1)
1)存储对当前(初始头),下一个(初始为null),上一个(初始为null)节点的引用
2)如果使用尾巴指针,则将尾巴设置为头部
3)遍历此列表设置,在current.next旁边,current.next在上一个next之前,在current之前,最后在next之前
4)根据循环后的操作方式,必须将current.next设置为previous,然后将其设置为current
我在下面提供了迭代和递归解决方案。
class Node {
constructor(value, next){
this.value = value;
this.next = next;
}
}
class LinkedList {
constructor(){
this.size = 0;
this.head = null;
this.tail = null;
}
add(value){
const node = new Node(value, null);
if(this.head === null){
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
this.tail = node;
}
this.size++;
}
traverse(){
let current = this.head;
while(current != null){
console.log(current.value);
current = current.next;
}
}
reverse(){
let current = this.head;
let previous = null;
let next = null;
this.tail = current;
while(current != null && current.next != null){
next = current.next;
current.next = previous;
previous = current;
current = next;
}
current.next = previous;
this.head = current;
}
_reverseRecursively(node){
if(node == null){
return null;
}
if(node.next == null){
this.head = node;
return node;
}
let nextNode = this._reverseRecursively(node.next);
nextNode.next = node;
node.next = null;
return node;
}
reverseRecursively(){
this.tail = this.head;
this._reverseRecursively(this.head);
}
}
const list = new LinkedList();
list.add(10);
list.add(12);
list.add(14);
console.log("Original List");
list.traverse();
list.reverse();
console.log("Reversed List - using loop");
list.traverse();
list.reverseRecursively();
console.log("Reversed List - using recursion");
list.traverse();