用JavaScript來實現鏈表LinkedList


本文版權歸博客園和作者本人共同所有,轉載和爬蟲請注明原文地址。

寫在前面

好多做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數據類型以及一些基本算法。

如果我的點滴分享對您有點滴幫助。歡迎你為自己點贊,也為我點贊。也歡迎點擊紅色按鈕長期關注,我將持續分享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM