前端校招準備系列 使用js實現鍊錶的操作

2021-09-13 07:44:09 字數 3297 閱讀 3239

在寫專案的時候會發現,並沒有使用很多關於鍊錶的東西,大多數情況使用的都是陣列,但是由於在準備校招,很多公司都會考到這個問題,所以準備對鍊錶的相關操作進行總結,並對其中的重難點進行強調,最後還會附加幾道關於鍊錶的演算法題,那麼現在就開始吧!

了解過鍊錶的同學應該都知道,鍊錶有幾個特點:

function linkedlist()

let length = 0;

let head = null;

this.insert() = function(position,element){};//在指定的位置新增節點

this.remove = function(element){};//將指定的節點刪除掉

this.removeat = function(position){};//將指定位置的節點刪除

this.searchelement = function(element){};//查詢指定元素的位置

this.searchposition = function(position){};//查詢指定位置的元素

}

上面**中包含了很多要實現的操作,包括最基本的增刪以及查詢。下面我們就來一一的實現上面列舉的方法:

}**分析:

根據傳入的元素定義乙個節點,該元素作為這個節點的值

定義乙個變數表示當前的節點

判斷是否含有頭節點,如果沒有頭節點,說明鍊錶中還沒有值,將傳進來的這個值作為頭節點;否則,對鍊錶進行遍歷,找到最後乙個節點,將其next屬性賦值為新增的節點

鍊錶的長度+1

分析

將這個位置的前乙個節點的next屬性賦值為這個節點,並將它原先的下乙個節點儲存下來,賦值給現在這個節點的next屬性

function insert(position,element)else

pervious.next = node;

node.next = current;

}length++;

return true;

}else

}

**分析:檢查postion是否越界,若沒有越界,則建立乙個節點

定義乙個變數表示當前的節點,初始化為頭節點,表示從頭節點開始遍歷;乙個變數表示當前節點的前乙個節點,作用是插入節點時方便找到前乙個節點

判斷是否在頭節點前新增,如果是就將頭節點賦給node的next屬性,並且頭節點改為這個節點;否則,遍歷出這個位置的節點,將該節點插入到這個位置的節點前面

鍊錶的長度+1

基本思路:刪除節點的操作就是將目標節點前面的那個節點的指標指向目標節點的有乙個節點

function removed(element)  

pervious.next = nextnode;

length--;

return true;

}else

}

**分析:重點在於抓住需要哪些節點,並且進行這個操作需要改變什麼,判斷條件是怎樣的
function removedat(position)

pervious.next = nextnode;

length--;

return true;

}else

}

其實查詢節點和刪除節點差不多,都是通過遍歷,找到相應的節點或是相應的位置,然後進行操作,說起來比刪除節點還要簡單

function searchelement(element)else

return index;

}}else

}

function searchposition(position)

return current;

}else

}

關於鍊錶的操作還有很多,複雜一點的鍊錶還有雙鏈表(在初始化節點的時候增加乙個前節點)和迴圈鍊錶(尾節點的下乙個節點是頭節點),這些鍊錶的操作也是可以使用js實現的,這裡就不多說了。總結一下,鍊錶的核心在於

這裡總結幾道在牛客網上的劍指offer中刷到的幾道關於鍊錶的演算法題,這些題在筆試中還是很有可能遇到的,接著往下看吧!

1. 輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。

思路:(1)將鍊錶值從頭到尾輸出到乙個陣列中,然後將這個陣列進行反轉得到arraylist

(2)使用陣列的unshift方法,將鍊錶值倒序放進陣列

(3)先使用棧存放順序遍歷的結果,利用棧先進後出的特性,出棧的時候用陣列儲存

//使用思路2的方法

function node(element)

function loglist(head)

return arraylist;

}else

}

2. 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。思路:(1)查詢倒數第k個節點,可以看做是查詢正序第length-k個節點

(2)可以根據第一題的結果取陣列的第k-1個節點

//使用思路2

function node(element)

function findkthtotail(head, k)

return array[k-1];

}

3. 輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

function listnode(x)

function reverselist(phead)

for(let i =0;i< arr.length;i++)

return arr[0]}}

校招準備系列9 筆試面試演算法題

可以先對一些簡單情形進行手工模擬,查詢規律 有時先對陣列進行排序可以使運算變得簡單,提高效率 字串問題 括號匹配問題,可以考慮逆向思維,從右往左看 從初態到某一狀態a最少需要幾步?可以考慮從狀態a回到初態的逆過程需要幾步 括號匹配,標準匹配正負之和count為0,允許一次交換則count下限調整為 ...

使用js實現前端快取

使用js實現前端快取的工具類,在支援html5的瀏覽器上優先使用html5的storage進行快取 呼叫方式為 例如儲存 sy.cookiestring key value 此處使用的第三方js庫為 jquery.cookie.js jquery.js json2.js var sy sy sy.d...

使用JS實現前端快取

在前端瀏覽器中,有些資料 比如資料字典中的資料 可以在第一次請求的時候全部拿過來儲存在js物件中,以後需要的時候就不用每次都去請求伺服器了。對於那些大量使用資料字典來填充下拉框的頁面,這種方法可以極大地減少對伺服器的訪問。這種方法特別適用於使用iframe的框架。具體實現思路和方法 建立乙個cach...