レッスンに戻る

逆順に単方向連結リストを出力する

importance: 5

前の課題単方向連結リストを出力するで作成した単方向連結リストを逆順に出力してください。

ループを使用して解決する方法と再帰を使用して解決する方法は2つあります。

再帰を使用して

再帰ロジックは少し厄介です。

リストの残りを最初に表示してから、現在のリストを表示する必要があります。

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);

再帰的な解決策も実際には同じ動作をすることに注意してください。リストに従い、ネストした呼び出しのチェーン内の項目を記憶し(実行コンテキストスタック内)、それらを順番に出力します。