資料結構與演算法 JavaScript實現 —— 連結串列
連結串列是由一組不必相連的記憶體結構,按特定的順序連結在一起的抽象資料型別。連結串列儲存有序的元素集合,連結串列中的元素在記憶體中並不是連續放置的。每個元素有一個儲存元素本身的節點和一個指向下一個元素的指標組成。
(連結串列又分為單向連結串列、雙向連結串列、迴圈連結串列)
(單項鍊表)如下圖:
連結串列的每個節點都有一個指標來指向下一個節點。而要訪問連結串列中的某一個元素,可以從起點(表頭)開始迭代連結串列直接找到需要的元素。
利用JavaScript實現連結串列如下:
1.建立一個LinkedList, 裡面包含了一些連結串列的方法;
2.建立Node類用於建立節點,Node類有element屬性,next屬性,分別對應每個節點的值以及指向下一個元素的指標;
3.定義append方法用於在連結串列尾部直接加入一個節點:
1)建立一個節點(建立node物件), 宣告一個current變數用作表示當前的節點;
2)當頭結點(表頭)為空時,直接讓加入的節點為頭節點,
若頭結點不為空,把頭結點head賦值給current,迭代current的next指標,當current的next指標指向不為空時,
令current變為下一個節點。若current的next指標為空時,令current的next指標指向加入的節點node;
3)令連結串列的長度增加。
4.定義insert方法用於在連結串列中的特定位置新增節點:
1)insert方法裡有兩個引數, position和element, 分別表示連結串列節點的位置和新增的節點值;
2)判斷position是否會小於零並且不超過與連結串列的長度,若不符合要求則返回false;
3)若符合要求則建立一個節點,宣告一個current變數用作表示當前的節點,pervious表示當前節點的上一個節點,index表示位置。
4)若插入的位置為0,則令節點node的next指標指向current(已賦值head,即頭結點),令頭結點為節點node;
5)若插入的位置不為0,則自增index,迭代,若index自增後小與position,則讓pervious為當前的current節點,令current變為current.next指向的下一個節點。
若index自增後不小於position則令node節點的next指標指向current,pervious的next指標指向node;
6)令連結串列長度增加,返回true。
(其實插入只是想要插入的位置的兩個節點的指標,然後插入再連線)
5.定義removeAt方法用於刪除特定位置的節點:
1)檢查越界值,若越界則返回null,若不越界,則宣告current並賦值為頭結點head,pervious為當前節點的上一個節點,index為位置;
2)若position為0時,令頭結點head為current(頭結點head).next指向的下一個節點。
3)若position不為0,則自增index,迭代,若index自增後小於position,則讓pervious為當前的current節點,令current變為current.next指向的下一個節點。
4)若index自增後不小於position時,令pervious的next指標指向current的next指標指向的節點。
5)令連結串列長度減少。
6.定義indexOf方法用於返回需查詢節點的位置:
1)宣告current用作表示當前位置的節點並賦值head節點,宣告index表示位置並賦值為1;
2)迭代current,當current為空時返回-1;
3)若current不為空,則判斷需查詢的節點的值與當前節點的值是都匹配,若匹配,則返回位置index;
4)index自增,令current為current的next指標指向的下一個節點。
定義remove方法用於直接刪除想刪除的節點:
1)查詢該節點的位置;
2)利用removeAt方法刪除改節點。
7.定義getHead方法用於返回頭結點;
定義isEmpty方法用於判斷連結串列是否為空;
定義size方法用於返回連結串列長度。
8.定義toString方法用於輸出連結串列,同樣是迭代;
定義print方法用於列印連結串列。
(雙向連結串列)如下圖:
雙向連結串列即每個節點都有兩個指標,一個用於指向上一個節點,一個用於指向下一個節點
利用JavaScript實現雙向連結串列(類似單向連結串列,不詳講):
參考 《學習JavaScript 資料結構與演算法》