資料結構 鍊錶(LinkedList)

2022-07-11 18:18:15 字數 4260 閱讀 6735

三五七言

不要讓資料結構成為天花板

相關**位址

鍊錶是乙個線性結構,同時也是乙個天然的遞迴結構。鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機讀取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。

/**

* 基本屬性

* element當前節點的值

* next下乙個節點

* 基本方法

* insert(item, newitem)在item後面插入乙個新元素newitem插入乙個元素,需要將item元素節點的next指向新元素,新元素的next指向item元素的後繼元素。

* remove(pos)從隊頭刪除乙個元素刪除乙個節點時,需要將其前驅節點的next指向其後繼節點即可。

* find(element)查詢值為element的節點位置

* findpre(element)查詢值為element的節點的前乙個節點

* display()顯示整個鍊錶

*/class node

}class linkedlist

/*** 增加節點

* 在item節點之後增加newitem

*/insert(item, newitem)

} //刪除元素

remove(item)

} //查詢item元素的位置

find(item)

return node

} //是否為空表

isempty()

//尋找元素前乙個節點

findpre(item)

return prenode

} //展示鍊錶

display()

return result

}}module.exports = linkedlist

//測試插入方法

// let link = new linkedlist();

// link.insert('head',1);

// link.insert('head',2);

// link.insert(2,3);

// let fresult = link.display();

// console.log(fresult)

// // //測試刪除方法

// link.remove(2);

// link.remove(3);

// let fresult2 = link.display();

// console.log(fresult2)

特徵:每乙個例項會記錄前驅節點和後繼節點,雙向鍊錶比單鏈表增加了反向遍歷的能力,並且由於所查詢節點的屬性中包含了前驅和後繼節點的資訊,故插入節點和刪除節點時使用同乙個搜尋方法即可

/**

*實現乙個雙向鍊錶twowaylinkedlist類。

*/class node

}class twowaylinkedlist

//是否為空表

isempty()

/*** 增加節點

* 在item節點之後增加newitem

*/insert(item, newitem)

itemnode.next = newnode

newnode.pre = itemnode

}} //查詢item元素的位置

find(item)

return node

}//刪除元素

remove(item)

}//展示鍊錶

display()

return result;

}}module.exports = twowaylinkedlist

//測試插入方法

let link = new twowaylinkedlist();

link.insert('head',1);

link.insert('head',2);

link.insert('head',3);

let fresult = link.display();

console.log(fresult)

//測試刪除方法

link.remove(2);

link.remove(3);

let fresult2 = link.display();

console.log(fresult2)

特徵:迴圈鍊錶的特點是尾節點的next指標指向了頭節點

/**

*以linkedlist類為參考基準,實現乙個迴圈鍊錶circularlinkedlist類

迴圈鍊錶的特點是尾節點的next指標指向了頭節點

* */

//節點

class node

}//迴圈鍊錶

class circularlinkedlist

/*** 增加節點

* 在item節點之後增加newitem

*/insert(item, newitem)

//是否為空表

isempty()

//查詢item元素的位置

find(item)

return node;

}//刪除元素

remove(item)

}//尋找元素前乙個節點

findpre(item)

return prenode;

}//展示鍊錶

display()

return result;

}//設定啟用節點

setactive(item) else

}//測試迴圈指向

testcircle()

}return result;

}}module.exports = circularlinkedlist;

//測試插入方法

/*let link = new circularlinkedlist();

link.insert('head',1);

link.insert('head',2);

link.insert('head',3);

//let fresult = link.display();

let fresult = link.testcircle();

console.log(fresult)

//測試刪除方法

link.remove(2);

link.remove(3);

//let fresult2 = link.display();

let fresult2 = link.testcircle();

console.log(fresult2)

*/

傳說在公元1世紀猶太戰爭中,猶太歷史學家弗拉维奧·約瑟夫斯和他的40個同胞被羅馬士兵包圍,猶太士兵決定寧可自殺也不做俘虜,於是商量出乙個自殺方案。他們圍成乙個圈,從乙個人開始,數到第三個人事將第三個人殺死,然後再數,直到殺光所有人,約瑟夫和另乙個人決定不參加這個瘋狂的遊戲,他們快速地計算出兩個位置,站在那裡得以倖存。寫一段將n個人圍成一圈,並且第m個人會被殺掉,計算一圈中哪兩個人最後會存活,使用迴圈鍊錶解決該問題。

/**

* 傳說在公元1世紀猶太戰爭中,猶太歷史學家弗拉维奧·約瑟夫斯和他的40個同胞被羅馬士兵包圍,猶太士兵決定寧可自殺也不做俘虜,於是商量出乙個自殺方案。他們圍成乙個圈,從乙個人開始,數到第三個人事將第三個人殺死,然後再數,直到殺光所有人,約瑟夫和另乙個人決定不參加這個瘋狂的遊戲,他們快速地計算出兩個位置,站在那裡得以倖存。寫一段將n個人圍成一圈,並且第m個人會被殺掉,計算一圈中哪兩個人最後會存貨,使用迴圈鍊錶解決該問題

*/const circularlinkedlist = require('./circularlinkedlist');

let link = new circularlinkedlist();

//裝入1-40個號碼

init();

//開始報數

start();

//初始化

function init()

}function start()

link.activenode = link.activenode.next === link.head ? link.head.next : link.activenode.next;

index++;

}}

Redis資料結構 鍊錶 linkedlist

鍊錶簡介 因為c語言沒有內建鍊錶這種資料結構,所以redis構建了自己的鍊錶實現。列表鍵的底層實現之一就是鍊錶。當乙個列表鍵包含了數量比較多的元素,又或者列表中包含的元素都是比較長的字串時,redis就會使用鍊錶作為列表鍵的底層實現。1 鍊錶實現 鍊錶結點資料結構 雖然使用多個listnode結構就...

Redis資料結構 鍊錶 linkedlist

鍊錶在redis中使用廣,包括列表鍵的事件 客戶端的狀態儲存等都使用了鍊錶。adlist.h listnode結構來表示鍊錶節點 typedef struct listnode listnode 其實也就是我們平常資料結構中的雙向鍊錶節點的定義。adlist.h list結構來表示鍊錶 typede...

Java資料結構詳解(四) LinkedList

返回鍊錶的邏輯大小 transient int size 0 頭部節點 transient nodefirst 尾部節點 transient nodelast 一,無參構造器 public linkedlist 二,有引數的構造器 public linkedlist collection c add...