مسیرها
/
Go
Go
/
تمرین‌ها
/
لیست پیوندی
لیست پیوندی

لیست پیوندی

متوسط

مقدمه

شما روی پروژه‌ای کار می‌کنید که هدفش توسعه‌ی یک سامانه‌ی زمان‌بندی قطار برای شبکه‌ی راه‌آهنی پرتردد است.

از شما خواسته شده است که یک نمونه‌ی اولیه برای مسیرهای قطار در سامانه‌ی زمان‌بندی توسعه دهید. هر مسیر از دنباله‌ای از ایستگاه‌های قطار تشکیل می‌شود که قطار موردنظر در آن‌ها توقف می‌کند.

دستورالعمل‌ها

تیم شما تصمیم گرفته است برای نمایش هر مسیر قطار در برنامه‌ی زمانی، از یک «لیست پیوندی دوطرفه» استفاده کند. هر ایستگاه در مسیر قطار با یک گره در لیست پیوندی نمایش داده می‌شود.

لازم نیست نگران زمان رسیدن و حرکت در ایستگاه‌ها باشید. هر ایستگاه به‌سادگی با یک عدد نمایش داده می‌شود.

می‌توان مسیرها را گسترش داد و به ابتدا یا انتهای یک مسیر ایستگاه افزود. همچنین می‌توان با حذف ایستگاه‌ها از ابتدا یا انتهای یک مسیر، آن را کوتاه کرد.

گاهی یک ایستگاه تعطیل می‌شود و در آن صورت باید آن ایستگاه از مسیر حذف شود، حتی اگر در ابتدا یا انتهای مسیر نباشد.

اندازه‌ی یک مسیر نه با مسافتی که قطار می‌پیماید اندازه‌گیری می‌شود، بلکه با تعداد ایستگاه‌هایی که در آن‌ها توقف می‌کند.

Note

لیست پیوندی یک ساختار داده‌ی بنیادی در علوم کامپیوتر است که اغلب در پیاده‌سازی ساختارهای داده‌ی دیگر به کار می‌رود. همان‌طور که از اسمش پیداست، لیستی از گره‌هاست که به هم پیوند خورده‌اند. لیستی از «گره‌ها» است که هر گره به همسایه یا همسایه‌هایش پیوند می‌خورد. در یک لیست پیوندی یک‌طرفه هر گره فقط به گره بعدی خود پیوند می‌خورد. در یک لیست پیوندی دوطرفه هر گره هم به گره قبلی و هم به گره بعدی خود پیوند می‌خورد.

اگر می‌خواهید درباره‌ی لیست‌های پیوندی بیشتر بدانید، نگاهی به این مقاله بیندازید که آن را با تصویرهای زیبا توضیح می‌دهد.

پیاده‌سازی

شما یک پیاده‌سازی از فهرست پیوندی دوطرفه خواهید نوشت. یک Node پیاده‌سازی کنید که مقداری را نگه دارد و اشاره‌گرهایی به گره‌های بعدی و قبلی داشته باشد. سپس یک List پیاده‌سازی کنید که ارجاع‌هایی به اولین و آخرین گره نگه می‌دارد و توابعی برای افزودن و حذف عناصر ارائه می‌دهد.

Node شما باید فیلدها و متدهای زیر را داشته باشد:

  • Value: مقدار گره (ما از any استفاده خواهیم کرد).
  • Next() *Node: اشاره‌گر به گره‌ی بعدی.
  • Prev() *Node: اشاره‌گر به گره‌ی قبلی.

شما باید تابعی به اسم NewList() داشته باشید که یک List می‌سازد و برمی‌گرداند:

  • NewList(args ...any) *List: یک فهرست پیوندی جدید می‌سازد و ترتیب مقادیر را حفظ می‌کند.

List شما باید متدهای زیر را داشته باشد:

  • First() *Node: اشاره‌گری به اولین گره (سر) برمی‌گرداند.
  • Last() *Node: اشاره‌گری به آخرین گره (ته) برمی‌گرداند.
  • Push(v any): مقدار را در انتهای فهرست درج می‌کند.
  • Pop() (any, error): مقدار را از انتهای فهرست حذف می‌کند.
  • Unshift(v any): مقدار را در ابتدای فهرست درج می‌کند.
  • Shift() (any, error): مقدار را از ابتدای فهرست حذف می‌کند.
  • Reverse(): فهرست پیوندی را برعکس می‌کند.

منبع

موضوعی کلاسیک در علوم کامپیوتر
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Go Exercism

آماده‌اید لیست پیوندی را شروع کنید؟

در Exercism ثبت‌نام کنید تا Go را همراه با 34 مفهوم165 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.