一、實(shí)戰(zhàn)概述
- 本實(shí)戰(zhàn)通過(guò)JavaScript和Python兩種編程語(yǔ)言分別實(shí)現(xiàn)單鏈表數(shù)據(jù)結(jié)構(gòu)。首先,介紹了鏈表的基本概念,包括結(jié)點(diǎn)(包含數(shù)據(jù)域和指針域)和鏈表結(jié)構(gòu)(由多個(gè)結(jié)點(diǎn)按一定順序鏈接而成)。在JavaScript部分,創(chuàng)建了LinkedList.js文件,定義了Node類(lèi)和LinkedList類(lèi),實(shí)現(xiàn)了鏈表的增刪查改等核心操作,并通過(guò)HTML頁(yè)面展示其功能;而在Python部分,則直接編寫(xiě)程序并運(yùn)行,同樣實(shí)現(xiàn)了鏈表節(jié)點(diǎn)的創(chuàng)建、查找、插入、更新和刪除等操作,并實(shí)時(shí)查看執(zhí)行結(jié)果,以驗(yàn)證鏈表功能的正確性與實(shí)用性。
二、鏈表
(一)鏈表概述
- 鏈表是一種基本的線(xiàn)性數(shù)據(jù)結(jié)構(gòu),由一系列節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的引用。相比數(shù)組,鏈表具有動(dòng)態(tài)大小、插入和刪除高效等優(yōu)勢(shì),但訪(fǎng)問(wèn)元素需遍歷。分為單向鏈表和雙向鏈表,可實(shí)現(xiàn)棧、隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。鏈表在內(nèi)存分配中更靈活,適用于頻繁插入刪除的場(chǎng)景,是計(jì)算機(jī)科學(xué)中重要的數(shù)據(jù)結(jié)構(gòu)之一。
(二)結(jié)點(diǎn)結(jié)構(gòu)
- 結(jié)點(diǎn)是鏈表中的基本構(gòu)建單元,包含數(shù)據(jù)域和指針域。數(shù)據(jù)域存儲(chǔ)具體數(shù)據(jù),而指針域存儲(chǔ)指向下一個(gè)結(jié)點(diǎn)的地址,實(shí)現(xiàn)結(jié)點(diǎn)之間的連接。這靈活的結(jié)構(gòu)使得鏈表能夠動(dòng)態(tài)地存儲(chǔ)和管理數(shù)據(jù),支持高效的插入和刪除操作。每個(gè)結(jié)點(diǎn)的指針域充當(dāng)連接不同結(jié)點(diǎn)的橋梁,構(gòu)建出鏈表的結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)科學(xué)中被廣泛應(yīng)用,特別適用于需要頻繁插入和刪除操作的場(chǎng)景。
(二)鏈表結(jié)構(gòu)
- 鏈表是一種數(shù)據(jù)結(jié)構(gòu),由多個(gè)結(jié)點(diǎn)組成。每個(gè)結(jié)點(diǎn)包含數(shù)據(jù)域,存儲(chǔ)具體數(shù)據(jù),和指針域,指向下一個(gè)結(jié)點(diǎn)的地址。通過(guò)數(shù)據(jù)域可以訪(fǎng)問(wèn)所需數(shù)據(jù),通過(guò)指針域可以訪(fǎng)問(wèn)當(dāng)前結(jié)點(diǎn)之后的結(jié)點(diǎn),形成結(jié)點(diǎn)之間的連接。將這些結(jié)點(diǎn)串起來(lái)構(gòu)成鏈表,實(shí)現(xiàn)了動(dòng)態(tài)存儲(chǔ)和管理數(shù)據(jù)的功能。鏈表的靈活性使得它適用于需要頻繁插入和刪除操作的場(chǎng)景,是計(jì)算機(jī)科學(xué)中常用的數(shù)據(jù)結(jié)構(gòu)之一。
三、利用JavaScript實(shí)現(xiàn)鏈表
(一)創(chuàng)建LinkedList.js
- 在
js
目錄里創(chuàng)建LinkedList.js
// 定義鏈表結(jié)點(diǎn)類(lèi),包含數(shù)據(jù)(data)和指向下一個(gè)結(jié)點(diǎn)的指針(next)
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
// 定義鏈表類(lèi),初始化時(shí)設(shè)置頭結(jié)點(diǎn)為一個(gè)特殊結(jié)點(diǎn)(通常不存儲(chǔ)實(shí)際數(shù)據(jù))
class LinkedList {
constructor() {
// 初始化頭結(jié)點(diǎn)
this.head = new Node('head');
}
/**
* 根據(jù)給定值查找鏈表中的結(jié)點(diǎn)
* @param value 查找的目標(biāo)值
* @returns {Node|-1} 找到的結(jié)點(diǎn)或-1表示未找到
*/
findByValue = (value) => {
let currentNode = this.head; // 從頭結(jié)點(diǎn)開(kāi)始查找
// 循環(huán)直到找到目標(biāo)值或遍歷完整個(gè)鏈表
while (currentNode != null && currentNode.data !== value) {
currentNode = currentNode.next;
}
// 返回找到的結(jié)點(diǎn)或-1
return currentNode === null ? -1 : currentNode;
}
/**
* 根據(jù)索引查找鏈表中的結(jié)點(diǎn)
* @param index 查找的目標(biāo)索引
* @returns {Node|-1} 找到的結(jié)點(diǎn)或-1表示索引超出范圍
*/
findByIndex = (index) => {
let pos = 0;
let currentNode = this.head;
// 循環(huán)直到找到目標(biāo)索引位置或遍歷完整個(gè)鏈表
while (currentNode != null && pos !== index) {
currentNode = currentNode.next;
pos++;
}
// 返回找到的結(jié)點(diǎn)或-1
return currentNode === null ? -1 : currentNode;
}
/**
* 在指定元素后插入新元素
* @param value 插入的新元素值
* @param element 插入位置的參考元素值
*/
insert = (value, element) => {
let currentNode = this.findByValue(element);
// 判斷是否找到插入位置
if (currentNode === -1) {
console.log("未找到插入位置!");
} else {
// 創(chuàng)建新結(jié)點(diǎn)
let newNode = new Node(value);
// 讓新結(jié)點(diǎn)指向當(dāng)前結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
newNode.next = currentNode.next;
// 讓當(dāng)前結(jié)點(diǎn)指向新結(jié)點(diǎn)
currentNode.next = newNode;
}
}
/**
* 更新指定元素的值
* @param value 新的元素值
* @param element 需要更新的元素值
*/
update = (value, element) => {
let currentNode = this.findByValue(element);
// 判斷是否找到待更新元素
if (currentNode === -1) {
console.log("未找到指定元素[" + element.data + "]!");
} else {
currentNode.data = value;
}
}
/**
* 根據(jù)給定值刪除鏈表中的結(jié)點(diǎn)
* @param value 要?jiǎng)h除的結(jié)點(diǎn)值
* @returns {number} -1表示未找到要?jiǎng)h除的結(jié)點(diǎn),否則返回0表示刪除成功
*/
delete = (value) => {
let currentNode = this.head;
let previousNode = null;
// 尋找要?jiǎng)h除的結(jié)點(diǎn)
while (currentNode != null && currentNode.data !== value) {
previousNode = currentNode;
currentNode = currentNode.next;
}
// 判斷是否找到并刪除結(jié)點(diǎn)
if (currentNode == null) {
return -1;
} else {
previousNode.next = currentNode.next;
}
}
/**
* 遍歷整個(gè)鏈表并打印所有結(jié)點(diǎn)的值
*/
printAll = () => {
let currentNode = this.head;
// 遍歷并打印所有結(jié)點(diǎn)的數(shù)據(jù)
while (currentNode != null) {
console.log(currentNode.data);
currentNode = currentNode.next;
}
}
}
// 測(cè)試鏈表的各種操作
const list = new LinkedList();
list.printAll();
console.log('插入三個(gè)結(jié)點(diǎn):mike, howard, alice');
list.insert('mike', 'head');
list.insert('alice', 'mike');
list.insert('howard', 'mike');
list.printAll();
console.log("按值查找alice結(jié)點(diǎn)");
console.log(list.findByValue('alice').data);
console.log('按索引查找2結(jié)點(diǎn)');
console.log(list.findByIndex(2).data);
console.log('將alice修改為jenny');
list.update('jenny', 'alice');
list.printAll();
console.log('刪除howard結(jié)點(diǎn)')
list.delete('howard');
list.printAll();
- 這段代碼定義了一個(gè)簡(jiǎn)單的單鏈表數(shù)據(jù)結(jié)構(gòu),包含結(jié)點(diǎn)類(lèi)(Node)和鏈表類(lèi)(LinkedList)。Node類(lèi)用于創(chuàng)建鏈表中的每個(gè)元素,包含存儲(chǔ)數(shù)據(jù)(data)和指向下一個(gè)結(jié)點(diǎn)(next)的指針。LinkedList類(lèi)提供了插入、查找(按值或索引)、更新和刪除結(jié)點(diǎn)的方法,以及遍歷并打印所有結(jié)點(diǎn)數(shù)據(jù)的功能。在測(cè)試部分,首先初始化一個(gè)空鏈表,然后插入幾個(gè)結(jié)點(diǎn),通過(guò)各種方法進(jìn)行操作,并輸出結(jié)果以驗(yàn)證功能實(shí)現(xiàn)正確性。
(二)創(chuàng)建LinkedList.html
- 在根目錄創(chuàng)建
LinkedList.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>鏈表演示</title>
<script src="js/LinkedList.js"></script>
</head>
<body>
<h3>演示如何創(chuàng)建鏈表以及對(duì)鏈表進(jìn)行增刪改查操作</h3>
</body>
</html>
(三)瀏覽LinkedList.html
- 打開(kāi)調(diào)試窗口,查看鏈表操作結(jié)果
四、利用Python實(shí)現(xiàn)鏈表
(一)編寫(xiě)程序,實(shí)現(xiàn)功能
- 編寫(xiě)程序 -
實(shí)現(xiàn)鏈表.py
# 實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)
# 定義鏈表結(jié)點(diǎn)類(lèi),包含數(shù)據(jù)和指向下一個(gè)結(jié)點(diǎn)的引用
class Node:
def __init__(self, data):
self.data = data # 結(jié)點(diǎn)的數(shù)據(jù)
self.next = None # 指向下一個(gè)結(jié)點(diǎn)的引用
# 定義鏈表類(lèi),包含鏈表操作方法
class LinkedList:
def __init__(self):
# 初始化頭結(jié)點(diǎn),通常不存儲(chǔ)實(shí)際數(shù)據(jù)
self.head = Node('head')
# 根據(jù)給定值查找鏈表中的結(jié)點(diǎn)
def findByValue(self, value):
currentNode = self.head # 從頭結(jié)點(diǎn)開(kāi)始查找
while currentNode is not None and currentNode.data != value: # 循環(huán)直到找到目標(biāo)值或遍歷完整個(gè)鏈表
currentNode = currentNode.next
return -1 if currentNode is None else currentNode # 返回找到的結(jié)點(diǎn)或-1表示未找到
# 根據(jù)索引查找鏈表中的結(jié)點(diǎn)
def findByIndex(self, index):
pos = 0
currentNode = self.head
while currentNode is not None and pos != index: # 循環(huán)直到找到目標(biāo)索引位置或遍歷完整個(gè)鏈表
currentNode = currentNode.next
pos += 1
return -1 if currentNode is None else currentNode # 返回找到的結(jié)點(diǎn)或-1表示索引超出范圍
# 在指定元素后插入新元素
def insert(self, value, element):
targetNode = self.findByValue(element) # 查找插入位置的目標(biāo)結(jié)點(diǎn)
if targetNode == -1:
print("未找到插入位置!")
else:
newNode = Node(value) # 創(chuàng)建新結(jié)點(diǎn)
newNode.next = targetNode.next # 新結(jié)點(diǎn)指向目標(biāo)結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
targetNode.next = newNode # 目標(biāo)結(jié)點(diǎn)指向新結(jié)點(diǎn)
# 更新指定元素的值
def update(self, newValue, element):
targetNode = self.findByValue(element) # 查找待更新的結(jié)點(diǎn)
if targetNode == -1:
print("未找到指定元素[" + str(element.data) + "]!") # 若找不到該結(jié)點(diǎn)則輸出錯(cuò)誤信息
else:
targetNode.data = newValue # 更新結(jié)點(diǎn)的數(shù)據(jù)值
# 根據(jù)值刪除鏈表中的結(jié)點(diǎn)
def delete(self, value):
currentNode = self.head
previousNode = None
while currentNode is not None and currentNode.data != value: # 尋找要?jiǎng)h除的結(jié)點(diǎn)
previousNode = currentNode
currentNode = currentNode.next
if currentNode is None: # 判斷是否找到并刪除結(jié)點(diǎn)
return -1
else:
previousNode.next = currentNode.next # 刪除結(jié)點(diǎn)(斷開(kāi)前一個(gè)結(jié)點(diǎn)與當(dāng)前結(jié)點(diǎn)的連接)
# 遍歷整個(gè)鏈表并打印所有結(jié)點(diǎn)的值
def printAll(self):
currentNode = self.head
while currentNode is not None: # 遍歷并打印所有結(jié)點(diǎn)的數(shù)據(jù)
print(currentNode.data)
currentNode = currentNode.next
# 測(cè)試鏈表的各種操作
linked_list = LinkedList()
linked_list.printAll() # 打印初始空鏈表
print('插入三個(gè)結(jié)點(diǎn):mike, howard, alice');
linked_list.insert('mike', 'head')
linked_list.insert('alice', 'mike')
linked_list.insert('howard', 'mike')
linked_list.printAll() # 插入節(jié)點(diǎn)后打印鏈表
print("按值查找alice結(jié)點(diǎn)");
print(linked_list.findByValue('alice').data)
print('按索引查找2結(jié)點(diǎn)');
print(linked_list.findByIndex(2).data)
print('將alice修改為jenny');
linked_list.update('jenny', 'alice')
linked_list.printAll() # 修改節(jié)點(diǎn)后打印鏈表
print('刪除howard結(jié)點(diǎn)')
linked_list.delete('howard')
linked_list.printAll() # 刪除節(jié)點(diǎn)后打印鏈表
- 這段代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的單鏈表數(shù)據(jù)結(jié)構(gòu),包括結(jié)點(diǎn)類(lèi)(Node)和鏈表類(lèi)(LinkedList)。Node類(lèi)定義了鏈表中每個(gè)元素的數(shù)據(jù)(data)及指向下一個(gè)結(jié)點(diǎn)(next)的引用。LinkedList類(lèi)初始化時(shí)創(chuàng)建頭結(jié)點(diǎn),并提供了按值查找、按索引查找、插入新元素、更新指定元素值、根據(jù)值刪除結(jié)點(diǎn)以及遍歷打印所有結(jié)點(diǎn)的方法。測(cè)試部分展示了如何創(chuàng)建一個(gè)鏈表并進(jìn)行一系列基本操作,如插入、查找、更新和刪除結(jié)點(diǎn)等。
(二)運(yùn)行程序,查看結(jié)果
- 運(yùn)行程序 -
實(shí)現(xiàn)鏈表.py
五、實(shí)戰(zhàn)總結(jié)
- 本實(shí)戰(zhàn)通過(guò)JavaScript和Python兩種編程語(yǔ)言,詳細(xì)實(shí)現(xiàn)了單鏈表這一基本數(shù)據(jù)結(jié)構(gòu)。從理論層面介紹了鏈表的基本概念、節(jié)點(diǎn)結(jié)構(gòu)以及鏈表結(jié)構(gòu),并通過(guò)實(shí)際代碼展示了如何定義節(jié)點(diǎn)類(lèi)(Node)和鏈表類(lèi)(LinkedList),實(shí)現(xiàn)鏈表的增刪查改等核心操作。JavaScript部分利用HTML頁(yè)面直觀展示了鏈表功能的執(zhí)行結(jié)果;Python部分則直接運(yùn)行程序并輸出結(jié)果。實(shí)戰(zhàn)中,不僅創(chuàng)建了鏈表,還進(jìn)行了插入、查找(按值和索引)、更新和刪除結(jié)點(diǎn)的操作演示,驗(yàn)證了鏈表功能的正確性和實(shí)用性。通過(guò)本次實(shí)戰(zhàn),充分理解了鏈表在內(nèi)存管理上的靈活性以及其對(duì)于頻繁插入刪除操作的優(yōu)勢(shì),進(jìn)一步鞏固了對(duì)鏈表這一重要數(shù)據(jù)結(jié)構(gòu)的理解與應(yīng)用能力。
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-790826.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-790826.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)實(shí)戰(zhàn):利用JavaScript和Python實(shí)現(xiàn)鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!