本文版權歸博客園和作者本人共同所有,轉載和爬蟲請註明原文地址。 寫在前面 好多做web開發的朋友,在學習數據結構和演算法時可能比較討厭C和C++,上學的時候寫過的也忘得差不多了,更別提沒寫過的了。但幸運的是,你會JavaScript啊。我想說學好數據結構和基本演算法並非是要我們必須要去書寫,演算法的工作有 ...
本文版權歸博客園和作者本人共同所有,轉載和爬蟲請註明原文地址。
寫在前面好多做web開發的朋友,在學習數據結構和演算法時可能比較討厭C和C++,上學的時候寫過的也忘得差不多了,更別提沒寫過的了。但幸運的是,你會JavaScript啊。我想說學好數據結構和基本演算法並非是要我們必須要去書寫,演算法的工作有專業的職位專業的人來做,但是如果你希望走的更高,這些是必不可少的,比如你學習Redis,如果hashmap等相關結構的話,也只能停留在使用的層次上,永遠和優化不能掛鉤。我也是個一瓶子不滿半瓶子晃悠,和希望快速成長的伙伴們共同加深印象,共同提高吧。
如果你對JavaScript OOP還不太瞭解的話,請移步這兩篇分享:http://www.cnblogs.com/tdws/p/5947693.html http://www.cnblogs.com/tdws/p/5944254.html
如果你希望學習redis的話,可以看下這個鏈接 http://www.cnblogs.com/tdws/tag/NoSql/
進入正題
鏈表是一種動態的數據結構,不同於數組的是,鏈表分配記憶體空間的靈活性,它不會像數組一樣被分配一塊連續的記憶體。當你想在數組的任意位置,插入一個新值的時候,必須對數組中的各個元素進行相應的位置移動才能達到目標,開銷顯然是很大的。然而鏈表的靈活性在於它的每個元素節點分為兩部分,一部分是存儲元素本身,另一部分是指向下一個節點元素的引用,也可以稱為指針,當你要插入數據時,把上一個節點的向下指針指向新數據節點,新數據節點的向下指針指向原有數據。但是鏈表不像數組那樣可以直接通過索引立刻定位,只能通過遍歷。
圖畫的可能是亂了點,就是想突出一下,鏈表分配記憶體的動態性,你隨時隨地,都可以增加和刪除,並且記憶體的不連續性和無索引性。我暫時給鏈表類定義如下幾個方法
一個append追加元素,一個removeAt移除指定位置元素,一個insert在指定位置插入元素,toString輸出元素,一個indexOf尋找指定元素的索引。先上代碼吧:
function LinkedList() { var Node = function (element) { //新元素構造 this.element = element; this.next = null; }; var length = 0; var head = null; this.append = function (element) { var node = new Node(element); //構造新的元素節點 var current; if (head === null) { //頭節點為空時 當前結點作為頭節點 head = node; } else { current = head; while (current.next) { //遍歷,直到節點的next為null時停止迴圈,當前節點為尾節點 current = current.next; } current.next = node; //將尾節點指向新的元素,新元素作為尾節點 } length++; //更新鏈表長度 }; this.removeAt = function (position) { if (position > -1 && position < length) { var current = head; var index = 0; var previous; if (position == 0) { head = current.next; } else { while (index++ < position) { previous = current; current = current.next; } previous.next = current.next; } length--; return current.element; } else { return null; } }; this.insert = function (position, element) { if (position > -1 && position <= length) { //校驗邊界 var node = new Node(element); current = head; var index = 0; var previous; if (position == 0) { //作為頭節點,將新節點的next指向原有的頭節點。 node.next = current; head = node; //新節點賦值給頭節點 } else { while (index++ < position) { previous = current; current = current.next; } //遍歷結束得到當前position所在的current節點,和上一個節點 previous.next = node; //上一個節點的next指向新節點 新節點指向當前結點,可以參照上圖來看 node.next = current; } length++; return true; } else { return false; } }; this.toString = function () { var current = head; var string = ''; while (current) { string += ',' + current.element; current = current.next; } return string; }; this.indexOf = function (element) { var current = head; var index = -1; while (current) { if (element === current.element) { //從頭節點開始遍歷 return index; } index++; current = current.next; } return -1; }; this.getLength = function () { return length; } }寫在最後
接下來將將分享雙向LinkedList和hashMap以便談及redis數據類型以及一些基本演算法。
如果我的點滴分享對您有點滴幫助。歡迎你為自己點贊,也為我點贊。也歡迎點擊紅色按鈕長期關註,我將持續分享。