返回课程

以逆序输出单链表

重要性: 5

以逆序输出上一个任务 输出单链表 中的单链表。

给出两种解决方案:使用循环和使用递归。

使用递归

这里的递归逻辑有点棘手。

我们需要先输出链表的剩余部分,然后输出当前部分。

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printReverseList(list) {

  if (list.next) {
    printReverseList(list.next);
  }

  alert(list.value);
}

printReverseList(list);

使用循环

循环版本也比直接输出稍微复杂一些。

我们无法获取 list 中的最后一个值。我们也不能“回溯”。

所以我们可以先按顺序遍历所有项目,并将它们存储在一个数组中,然后以逆序输出我们存储的内容。

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printReverseList(list) {
  let arr = [];
  let tmp = list;

  while (tmp) {
    arr.push(tmp.value);
    tmp = tmp.next;
  }

  for (let i = arr.length - 1; i >= 0; i--) {
    alert( arr[i] );
  }
}

printReverseList(list);

请注意,递归解决方案实际上做了完全相同的事情:它遍历链表,将项目存储在嵌套调用链中(在执行上下文栈中),然后输出它们。