30Day LeetCoding Callenge — Week2
這禮拜多了幾題Linked List,Linked List 在js是用nested object 取代的,
如果要做Linked List 的運算則還要考慮到遞迴的用法。
這禮拜的重點技巧:
- Linked List (鏈結串列)
 - Recursion (遞迴)
 
LinkedList
LinkedList在javascript的呈現為:
{
  val:0,
  next:{
    val:1,
    next:null
  }
}
如果JS要做鏈結串列的話就必須自己建立function製造
要先有Node節點,每個節點會要的資料,如果有需要可以多塞value進去
class Node{
    constructor(data, next = null){
        this.data = data,
        this.next = next
    }
}
建立LinkedList 的開頭
class LinkedList{
    constructor(){
        this.head = null;
    }
}
在設計塞入節點的function,執行後會發現最後一個是陣列最開始的值,這是正常的,因為程式是把現有的 this.head 塞進 nweNode.next 合併在蓋回原本的this.head。
詳細可再參考:Linked Lists in JavaScript (ES6 code)
LinkedList.prototype.insertAtBeginning = function(data){
    let newNode = new Node(data);
    newNode.next = this.head; 
    this.head = newNode;
    return this.head;
}
題目
1. Middle of the Linked List
說明:找出Linked List 的中間節點,抓出中間節點以後的Linked List
思維:找出Linked List 中間的節點然後回傳節點往後的LinkedList。這題目是應用如何從LinkedList 取得資料,這邊就會先暫存當下的節點,然後取的資料後再把next的資料蓋到暫存得值,直到拿到符合的答案。
var middleNode = function(head) {
    let listLength = 1 
    let a = 0
    let test = head
    
    while(test.next){
        test = test.next
        listLength += 1
    }
    
    let mid = Math.floor(listLength / 2) + 1
    let answer = head
    
    while(mid > 0 && head){
        answer = head
        head = head.next
        mid--
    }
    
    return answer
};
Recusion
recusion 是一個不好懂的演算法,但也是一個常見的基本技巧,我們先用階乘(factorail) 6! Demo!
看起來就是在function內重複呼叫自己,但要注意需要下判斷是終止回調(callback)
所以在 num - 1 = 1 的時候就回傳 1 這樣最會在 2 * 1 的時候結束。
題目
以下有幾題是有相關應用的題目,詳細解題思路可以參考
4.Diameter of Binary Tree
說明:算出二元樹的兩端節點最遠距離
Example:
Given a binary tree
          1
         / \
        2   3
       / \     
      4   5
ans :3 
思維:這題依照資料結構的答案思路,就是計算左邊的最深度及右邊的最深度,所以會用Recusion 跑到node == null 也就是節點的終點結束,因為不知道多長不能假設迴圈的index所以用Recusion是最適合的。
Answer:
let max 
var diameterOfBinaryTree = function(root) {
    max = 1
    dfs(root)
    return max -1
};
const dfs = node =>{
    if(node === null) return 0
    let left = dfs(node.left)
    let right = dfs(node.right)
    max = Math.max(max,left + right + 1)
    return Math.max(left,right)  + 1
}
