پیاده سازی کارآمد لیست های پیوندی در NestJS

معرفی
NestJS، یک فریم ورک پیشرو Node.js، یک پلتفرم قوی برای ساخت برنامه های کاربردی سمت سرور کارآمد و مقیاس پذیر ارائه می دهد. درک و پیاده سازی ساختارهای داده کارآمد می تواند به طور قابل توجهی عملکرد و قابلیت نگهداری برنامه های کاربردی شما را بهبود بخشد. این مقاله بر روی لیستهای پیوندی، بهویژه Single Linked List (SLL)، یک ساختار داده بنیادی و نحوه استفاده مؤثر از آنها در NestJS تمرکز دارد.
درک لیست های پیوندی
بررسی اجمالی:
لیست پیوندی یک ساختار داده خطی است که در آن هر عنصر (گره) حاوی یک مرجع (پیوند) به عنصر بعدی در دنباله است. بر خلاف آرایهها، لیستهای پیوندی به مکانهای حافظه پیوسته نیاز ندارند، و آنها را برای درج و حذف کارآمد میکند.
انواع لیست های پیوندی:
- لیست پیوندی منفرد: هر گره به گره بعدی اشاره می کند.
- لیست پیوندی مضاعف: هر گره به هر دو گره بعدی و قبلی اشاره می کند.
- لیست پیوندی دایره ای: آخرین گره به گره اول برمی گردد و یک دایره را تشکیل می دهد.
پیاده سازی یک لیست پیوندی در NestJS
-
کلاس گره:
هر گره در یک لیست پیوندی حاوی داده ها و ارجاع به گره بعدی است.
export class ListNode {
constructor(
public data: any,
public next: ListNode | null = null,
) {}
}
-
کلاس لیست پیوندی:
کلاس لیست پیوندی گره ها را مدیریت می کند و روش هایی را برای عملیات رایج ارائه می دهد.
export class LinkedList {
private head: ListNode | null = null;
add(data: any): void {
const newNode: ListNode = new ListNode(data);
if (!this.head) {
this.head = newNode;
} else {
let current: ListNode = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
}
remove(data: any): void {
if (!this.head) {
return;
}
if (this.head.data === data) {
this.head = this.head.next;
return;
}
let current: ListNode = this.head;
while (current.next && current.next.data !== data) {
current = current.next;
}
if (current.next) {
current.next = current.next.next;
}
}
find(data: any): ListNode | null {
let current: ListNode = this.head;
while (current && current.data !== data) {
current = current.next;
}
return current;
}
print(): void {
let current: ListNode = this.head;
while (current) {
console.log(current.data);
current = current.next;
}
}
}
-
سرویس NestJS:
لیست پیوندی را در یک سرویس NestJS ادغام کنید تا عملیات آن را محصور کنید.
@Injectable()
export class LinkedListService {
private linkedList: LinkedList = new LinkedList();
addElement(data: any): void {
this.linkedList.add(data);
}
removeElement(data: any): void {
this.linkedList.remove(data);
}
findElement(data: any): ListNode {
return this.linkedList.find(data);
}
getElements(): void {
return this.linkedList.print();
}
}
یکپارچه سازی کنترلر
یک کنترلر ایجاد کنید تا عملیات لیست پیوندی را از طریق نقاط انتهایی API در معرض دید قرار دهید.
@Controller('linked-list')
export class LinkedListController {
constructor(private readonly linkedListService: LinkedListService) {}
@Post('add')
addElement(@Body('data') data: any) {
this.linkedListService.addElement(data);
return { message: 'Element added successfully' };
}
@Delete('remove')
removeElement(@Body('data') data: any) {
this.linkedListService.removeElement(data);
return { message: 'Element removed successfully' };
}
@Get('find')
findElement(@Body('data') data: any) {
const element = this.linkedListService.findElement(data);
return { element };
}
@Get()
getElements() {
this.linkedListService.getElements();
return { message: 'Elements printed successfully' };
}
}
بهینه سازی لیست های پیوندی
- پیچیدگی زمانی:
- درج: O(1) اگر در قسمت سر وارد شود. O(n) در صورت قرار دادن در دم.
- حذف: O(1) در صورت حذف سر. O(n) اگر گره دیگری را حذف کنید.
- جستجو: O(n).
موارد استفاده:
- از لیست های پیوندی برای سناریوهایی استفاده کنید که در آن درج و حذف مکرر مورد نیاز است.
- مناسب برای اجرای صف ها، پشته ها و سایر ساختارهای داده پویا.
نتیجه
درک و پیاده سازی لیست های پیوندی در NestJS می تواند عملکرد و مقیاس پذیری برنامه های شما را تا حد زیادی افزایش دهد. با ادغام لیست های پیوندی در سرویس ها و کنترلرهای NestJS، می توانید راه حل های قوی و کارآمدی برای موارد استفاده مختلف ایجاد کنید. این پیاده سازی ها را در پروژه های خود آزمایش کنید تا فواید آن را از نزدیک ببینید.
راه من تنها راه نیست!