返回課程

以反向順序輸出單向連結串列

重要性: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);

請注意,遞迴解法實際上執行完全相同的工作:它遵循串列,記住巢狀呼叫鏈中的項目(在執行內容堆疊中),然後再輸出它們。