نحوه پیاده سازی لیست پیوندی منفرد در جاوا اسکریپت

سلام 👋، به این مجموعه در لیست های پیوندی خوش آمدید. در آخرین مقاله خود با اصول اولیه لیست های پیوندی از جمله تعریف آنها، اصطلاحات، تفاوت آن با آرایه ها و انواع لیست های پیوندی آشنا شدیم. من قول دادم که در پیاده سازی لیست های پیوندی عمیق تر بپردازیم، پس بیایید شروع کنیم.
طرح کلی دوره
- مقدمه
-
پیاده سازی لیست های پیوندی منفرد
- نتیجه گیری
مقدمه
همانطور که در مقاله قبلی آموختیم، لیست های پیوندی ساختارهای داده بنیادی در دنیای برنامه نویسی هستند. آنها از گره ها تشکیل شده اند که در آن هر گره حاوی داده ها و یک مرجع (یا پیوند) به گره بعدی (در یک لیست پیوندی منفرد) یا هر دو گره بعدی و قبلی (در یک لیست پیوندی دوگانه) در دنباله است. برخلاف آرایهها، لیستهای پیوندی عناصر را در مکانهای حافظه پیوسته ذخیره نمیکنند و امکان درج و حذف کارآمد را فراهم میکنند.
درک مفهوم لیست پیوندی برای تسلط بر ساختارهای داده و الگوریتم ها بسیار مهم است. در این مقاله، ما به طور عمیقتر به پیادهسازی لیستهای پیوندی میپردازیم و با اصول اولیه یک لیست پیوندی شروع میکنیم.
پیاده سازی لیست های پیوندی منفرد
یک لیست پیوندی ساده ترین نوع لیست پیوندی است که در آن هر گره به گره بعدی در دنباله اشاره می کند. درست مانند تصویر زیر.
اکنون زمان آن رسیده است که عملیاتهای اساسی فهرست پیوندی خود را پیادهسازی کنیم. آیا ما؟
ایجاد گره جدید
بیایید با ایجاد یک جدید شروع کنیم Node
کلاس را Node
کلاس یک سازنده خواهد داشت که داده های گره و a را می گیرد next
اشاره گر که در ابتدا روی null
.
// Node class for Singly Linked List
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
این کلاس Node جدید ایجاد شده (که نشان دهنده یک گره در لیست پیوند شده است) می تواند به صورت زیر تجسم شود.
قبل از ادامه، اجازه دهید یک نمونه جدید از خود ایجاد کنیم SinglyLinkedList
کلاسی که عملیات لیست پیوندی ما را نگه می دارد.
// Singly Linked List class
class SinglyLinkedList {
constructor() {
this.head = null;
}
// Operations come here 👇
}
در ابتدا درج کنید
class SinglyLinkedList {
constructor() {
this.head = null;
}
// Previous `SinglyLinkedList` class codes here 👇
// .
// .
// .
// Insert at the beginning
insertAtBeginning(data) {
const newNode = new Node(data); // Create a new node with the given data
newNode.next = this.head; // Set the new node's next pointer to the current head
this.head = newNode; // Update the head to be the new node
}
// Other operations come here 👇
// .
// .
// .
}
توضیح: درج کردن در ابتدا مانند این است که فردی جدید به خط جلو می پیوندد. آنها به اولین شخص جدید تبدیل می شوند و به اولین شخص قبلی پیوند می زنند.
در انتها درج کنید
class SinglyLinkedList {
constructor() {
this.head = null;
}
// Previous `SinglyLinkedList` class codes here 👇
// .
// .
// .
// Insert at the end
insertAtEnd(data) {
const newNode = new Node(data); // Create a new node with the given data
// check if the list does not have a head i.e the list is empty
// NOTE: Every non-empty linked list will have a head
if (!this.head) {
this.head = newNode; // If the list is empty, set the new node as the head
return;
}
let current = this.head; // Start at the head of the list
while (current.next) {
current = current.next; // Move to the next node in the list by updating the current node
}
current.next = newNode; // Set the next pointer of the last node to the new node
}
// Other operations come here 👇
// .
// .
// .
}
توضیح: درج کردن در انتها مانند کسی است که در انتهای خط به خط می پیوندد. باید تا آخر راه برویم تا آخرین نفر را پیدا کنیم، سپس آنها را به فرد جدید پیوند دهیم.
یک گره را حذف کنید
class SinglyLinkedList {
constructor() {
this.head = null;
}
// Previous `SinglyLinkedList` class codes here 👇
// .
// .
// .
// Delete a node
deleteNode(data) {
if (!this.head) return; // If the list is empty, do nothing
if (this.head.data === data) {
this.head = this.head.next; // If the node to delete is the head, update the head to the next node
return;
}
let current = this.head;
while (current.next) {
if (current.next.data === data) {
current.next = current.next.next; // If the node to delete is found, update the next pointer to skip it
return;
}
current = current.next;
}
}
// Other operations come here 👇
// .
// .
// .
}
توضیح: حذف یک گره مانند کسی است که در وسط خط تصمیم به ترک می گیرد. ما آن شخص را پیدا می کنیم و قبل از او را به بعد از او متصل می کنیم.
جستجوی یک گره
class SinglyLinkedList {
constructor() {
this.head = null;
}
// Previous `SinglyLinkedList` class codes here 👇
// .
// .
// .
// Search note
search(data) {
let current = this.head; // Start at the head of the list
while (current) {
if (current.data === data) {
// If the data is found, return true
return true;
}
current = current.next; // Move to the next node
}
return false;
}
// Other operations come here 👇
// .
// .
// .
}
توضیح: جستجو برای یک گره مانند تلاش برای یافتن یک شخص خاص در خط است. از جلو شروع می کنیم و از هر نفر می پرسیم تا آن را پیدا کنیم یا به آخر برسیم.
از فهرست عبور کنید
class SinglyLinkedList {
constructor() {
this.head = null;
}
// Previous `SinglyLinkedList` class codes here 👇
// .
// .
// .
traverse() {
let current = this.head; // Start at the head of the list
while (current) {
console.log(current.data); // Print the data of the current node
current = current.next; // Move to the next node
}
}
}
// End of class
توضیح: پیمایش مانند این است که در خط راه بروید و به هر فردی سلام کنید. از جلو شروع می کنیم و به حرکت ادامه می دهیم تا به آخر برسیم.
نتیجه گیری
در این مقاله، با عملیات اولیه لیست های پیوندی و نحوه پیاده سازی آنها در جاوا اسکریپت آشنا شدیم. در مقاله بعدی با لیست های دارای پیوند دوگانه آشنا خواهیم شد.
به یاد داشته باشید، تسلط بر لیست های پیوندی نیاز به تمرین دارد. به حل مشکلات و پیاده سازی این ساختارهای داده در سناریوهای مختلف ادامه دهید.
به روز و متصل بمانید
برای اطمینان از اینکه هیچ بخشی از این مجموعه را از دست ندهید و برای گفتگوهای عمیق تر در مورد توسعه نرم افزار (وب، سرور، موبایل یا خراش / اتوماسیون)، ساختارهای داده و الگوریتم ها و سایر موضوعات فنی هیجان انگیز با من ارتباط برقرار کنید. من در:
با ما همراه باشید و کدنویسی را شاد کنید 👨💻🚀