得到鏈表的第 N 個節點。系列目錄見 前言和目錄 。javascript
實現一個 getNth()
方法,傳入一個鏈表和一個索引,返回索引表明的節點。索引以 0 爲起始,第一個元素索引爲 0 ,第二個爲 1 ,以此類推。好比:java
getNth(1 -> 2 -> 3 -> null, 0).data === 1 getNth(1 -> 2 -> 3 -> null, 1).data === 2
傳入的索引必須是在效範圍內,即 0..length-1
,若是索引不合法或者鏈表爲空都須要拋出異常。node
假設函數定義爲 getNth(head, idx)
,遞歸過程爲:當 idx
爲零,直接返回該節點,不然遞歸調用 getNth(head.next, idx - 1)
。再處理下邊界狀況就完成了,代碼以下:git
function getNth(head, idx) { if (!head || idx < 0) throw 'invalid argument' if (idx === 0) return head return getNth(head.next, idx - 1) }
我選擇的 for
循環,這樣方便把邊界狀況檢查都放到循環裏去。若是循環結束尚未查到節點,那確定是鏈表或者索引不合法,直接拋異常便可。對比這兩個版本和 02 Length & Count 的例子,不難看出循環能夠比遞歸更容易地處理邊界狀況,由於一些條件檢查能夠寫進循環的頭部,遞歸就得本身寫 if/else
邏輯。github
function getNthV2(head, idx) { for (let node = head; node && idx >= 0; node = node.next, idx--) { if (idx === 0) return node } throw 'invalid argument' }
Codewars Kata
GitHub 的代碼實現
GitHub 的測試segmentfault