はじめに
こんにちは!Shungiku です。
最近は就活のために専ら LeetCode の問題を解いていることが多いです。
さて、LeetCode では連結リストの問題(例えばこれとか)において、入力のサンプルが以下のような配列で与えられます。
head = [1,2,3,4]
一方、実際に Submit した場合、関数(またはメソッド)の引数で受け取る入力値は連結リストのヘッドのノードになっています。
ちなみにノードの構造は LeetCode では以下のように定義されています。
class ListNode {
val: number
next: ListNode | null
constructor(val?: number, next?: ListNode | null) {
this.val = (val===undefined ? 0 : val)
this.next = (next===undefined ? null : next)
}
}
「入力サンプルの配列をListNode
を用いた連結リストに変換してくれるヘルパー関数がほしい!」というのが、本稿のモチベーションです。
そんなヘルパー関数があれば、Failしたケースについてデバッグする際、サクッと入力値を用意できて便利です。
実装
配列から連結リストを組み立てる関数は以下のようになります。
function buildList(array: number[]): ListNode | null {
let next_node: ListNode | null = null
const reversed = array.slice().reverse()
reversed.forEach(val => { // (1)
const node = new ListNode(val) // (2)
node.next = next_node // (3)
next_node = node // (4)
})
return next_node
}
引数で受け取る配列を後ろから処理しています。
例えば引数が [1, 2, 3, 4]
だった場合、 [4, 3, 2, 1]
の順で以下のように処理が進みます。
1ループ目
- (1)
4
に対して処理を開始 - (2)ノードを生成(★)
- (3)★ノードの
next
に Keep してあるnext_node
(初期値の null) を突っ込む - (4)★ノードを
next_node
として Keep
2ループ目
- (1)
3
に対して処理を開始 - (2)ノードを生成(★)
- (3)★ノードの
next
に Keep してあるnext_node
(前ループで生成した4
のノード) を突っ込む - (4)★ノードを
next_node
として Keep
3ループ目...以下同文
まとめ
これで Fail したケースに対してのデバッグが捗るぜ...!
ちなみに木構造についても同様の記事を執筆してますので、以下ご参照ください。