1. 程式人生 > 實用技巧 >前端程式設計師學好算法系列(三)連結串列

前端程式設計師學好算法系列(三)連結串列

接下來我們來看連結串列題

206. 反轉連結串列
反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

解題:
連結串列題需要我們設立更多的指標來儲存我們當前操作的細節;
1.我們需要定義3個指標 pre,cur ,next,pre為當前連結串列的前一個節點預設為空,cur為連結串列的第一個指標, 下一個指標next 為 cur.next 因為有可能存在越界所以我們在存在cur的時候再去取next指標;
2.我們把next指標指向pre,pre指向當前cur指標,當前指標指向暫存的next,最後我們返回pre指標;

var reverseList = function(head) {

   let pre = null
   let cur = head
   let next = null
   while(cur!=null){
       next = cur.next
       // 將當前節點指向pre
       cur.next = pre
       pre = cur
       cur = next
   }
   return pre

};

203. 移除連結串列元素
刪除連結串列中等於給定值 val 的所有節點。

示例:

輸入: 1->2->6->3
->4->5->6, val = 6 輸出: 1->2->3->4->5

解題:
1.當前刪除邏輯如上圖,但需要注意的是我們刪除連結串列第一個節點時,是不適用的,所以我們一般採用增加虛擬頭節點的方式,

2.連結串列問題的令一個重要思想是明白js物件是引用型別 let a = {name: '1'} let b = a 時,修改b的屬性(注意不是本身)時,資料a的值也會發生改變

let a = {name:1}
let b = a
b.name = 2
console.log(a) //輸出 {name: 2}

3.我們迴圈cur.next的下一個指標 如果cur.next.val==val時,我們把cur.next = cur.next.next,最後返回list.next

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function(head, val) {
     let list = new ListNode(-1)
     list.next = head
     let cur = list
     while(cur.next!==null){
         if(cur.next.val==val){
            cur.next = cur.next.next
         }else {
            cur = cur.next
         }
     }
     return list.next
};