JavaScriptでチェーン操作を実現


TL;DR
チェーンをもう一つのチェーンの最後に連結します.シリーズの目次は前文と目次に会ってください.
需要
一つのappend()関数を実現して、二つのチェーンテーブルを連結して、接続後のチェーンブロックのノードを返します.
var listA = 1 -> 2 -> 3 -> null
var listB = 4 -> 5 -> 6 -> null
append(listA, listB) === 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
二つのチェーンが全部nullならnullに戻り、そのうちの一つがnullなら別のチェーンに戻ります.
再帰版append自体は、再帰的論理として機能することができる.append(listA, listB)は、実際にはlistA.next = append(listA.next, listB)に等しく、listAが最後のnullに戻るまでは、append(null, listB)は直接listBに戻れば良い.境界条件の判断を加えると、コードは以下の通りです.
function append(listA, listB) {
  if (!listA) return listB
  if (!listB) return listA

  listA.next = append(listA.next, listB)
  return listA
}
サイクルバージョン
ループの考え方は、listAおよびlistBがいずれも空でない場合、listAのエンドノードを先に見つけて、nodeと仮定して、node.next = listBであればいいということである.コードは以下の通りです
function appendV2(listA, listB) {
  if (!listA) return listB
  if (!listB) return listA

  let node = listA
  while (node.next) node = node.next

  node.next = listB
  return listA
}
参考資料
Codewars Kata GitHubのコードはGitHubのテストを実現します.