使用Javascript的LinkedList递归问题

时间:2019-01-16 19:03:04

标签: javascript

寻求帮助来解决此递归问题:给定一个不确定长度的链表,该链表由存储对下一个节点的引用的节点组成。...如何反向返回该列表?

例如,节点A-> B-> C-> D应该返回D-> C-> B-> A。该函数被赋予任何节点,并且应该反向返回该列表。

一个节点将由几个值组成;一个整数(i)和一个 next 属性,该属性是指向下一个节点的指针。

const traverseList = (node) => {
    if(node.next !== null) traverseList(node);
    else return;
}

我正在尝试此代码,但无法正常工作。请只寻找丢失的部分。谢谢你的帮助。

2 个答案:

答案 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();