單鏈表 迴圈鍊錶的JS實現

2022-08-27 01:36:13 字數 3744 閱讀 5598

資料結構系列前言:

資料結構作為程式設計師的基本知識,需要我們每個人牢牢掌握。近期我也展開了對資料結構的二次學習,來彌補當年挖的坑。。。。。。   當時上課的時候也就是跟著聽課,沒有親自實現任何一種資料結構,更別提利用資料結構來解決問題了。  現在就來填坑了

在這裡提醒看到我部落格的孩子們,如果你還是在校生,永遠不要輕視任何一門基礎課的學習,這個時候挖的坑,要麼需要用雙倍的努力去填,要麼會直接影響乙個人的能力等等。。。。。。

千萬別給自己挖坑

進入正題,關於鍊錶的資料結構知識,這裡簡單介紹下:

鍊錶是一種物理儲存單元上非線性、非連續性的資料結構(它在資料邏輯上是線性的),它的每個節點由兩個域組成:資料域和指標域。資料域中儲存實際資料,指標域則儲存著指標資訊,指向鍊錶中的下乙個元素或者上乙個元素。正是由於指標的存在,鍊錶的儲存在物理單元是非連續性的。 

鍊錶的優點和缺點同樣明顯。和線性表相比,鍊錶在新增和刪除節點上的效率更高,因為其只需要修改指標資訊即可完成操作,而不像線性表(陣列)那樣需要移動元素。同樣的,鍊錶的長度在理論上也是無限的(在儲存器容量範圍內),並可以動態變化長度,相比線性表優勢很大。 相應的,由於線性表無法隨機訪問節點,只能通過指標順著鍊錶進行遍歷查詢來訪問,故其訪問資料元素的效率比較低。  

下面是js部分

這裡面封裝了的常用方法及描述:

方法描述

向鍊錶尾部新增結點element

insert(position,element)

向位置position處插入結點element

removeat(position)

按照索引值position刪除結點

remove(element)

搜尋並刪除給定結點element

remove() 

刪除鍊錶中最後乙個結點

indexof(element)

查詢並返回給定結點element的索引值

isempty() 

判斷鍊錶是否為空

size()

獲取鍊錶長度

tostring()

轉換為字串輸出

gethead()

獲取頭結點

gettail() 

獲取尾結點

對於各常用方法的演算法描述在這裡就不寫了,相信大家都可以輕易讀懂並理解,畢竟都是非常基礎的知識了。

單鏈表:

function linkedlist()

var length = 0, //存放鍊錶長度

head = null; //頭指標

var node = new node(element),

current; //操作所用指標

if (!head)else

current.next = node;

}length++;

return true;

}; this.insert = function(position, element)else

node.next = current;

previous.next = node;

}length++;

return true;

}else

};this.removeat = function(position)else

previous.next = current.next;

};length--;

return current.element;

}else

}; this.remove = function(element)

previous = current;

current = current.next;

while(current)else

}return false;

}; this.remove = function()

var current = head,

previous;

if(length == 1)

while(current.next !== null)

previous.next = null;

length--;

return current.element;

}; this.indexof = function(element)

index++;

current = current.next;

}return false;

}; this.isempty = function();

this.size = function();

this.tostring = function()

return string;

};

this.gethead = function()

}

迴圈鍊錶:在單鏈表的基礎上,將尾節點的指標指向頭結點,就構成了乙個迴圈鍊錶。環形鍊錶從任意乙個節點開始,都可以遍歷整個鍊錶。

function circularlinkedlist()

var length = 0,

head = null;

var node = new node(element),

current;

if (!head) else

current.next = node;

node.next = head;

};length++;

return true;

}; this.insert = function(position, element)else

previous.next = node;

node.next = current;

};length++;

return true;

}else

}; this.removeat = function(position)else

previous.next = current.next;

};length--;

return current.element;

}else

}; this.remove = function (element)else

}else

} return false;

}; this.remove = function()

var current = head,

previous,

indexcheck = 0;

if(length === 1)

while(indexcheck++ < length)

previous.next = head;

length--;

return current.element;

}; this.indexof = function(element)else

} return false;

}; this.isempty = function();

this.size = function();

this.tostring = function()

return string;

};

}

使用方法:

在外部擴充方法:

因為每次遍歷所做的操作都是不同的,所以遍歷方法我都是在使用環境中用類擴充方法現寫進去,方法如下

關於雙向鍊錶與雙向迴圈鍊錶,見本人另一篇部落格:  雙向鍊錶、雙向迴圈鍊錶的js實現

迴圈鍊錶 迴圈雙鏈表 迴圈單鏈表

迴圈單 雙鏈表,建立 初始化 尾插 頭插 遍歷 插入 刪除 判空 部分函式採用過載 此處為c include include include using namespace std typedef struct lnodelnode,linklist typedef struct dnodednod...

單鏈表 雙鏈表 迴圈鍊錶總結

1.單鏈表 為公升序鍊錶,value按公升序排列 include include typedef struct node node 最好放在標頭檔案中 node sll creat int sll length node p node sll del node head,int value void...

單鏈表 迴圈鍊錶 雙向鍊錶的比較

查詢表頭結點 首元結點 查詢表尾結點 查詢結點 p的前趨節點 帶頭結點的單鏈表l l next 時間複雜度o 1 從 l next 依次向後遍歷 時間複雜度o n 通過 p next 無法找到其前驅 帶頭結點僅設頭指標l的迴圈單鏈表 l next 時間複雜度o 1 從 l next 依次向後遍歷 時...