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

لیست پیوندی

متوسط

مقدمه

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

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

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

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

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

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

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

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

Note

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

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

پیاده‌سازی

این تمرین مفهوم جنریک را معرفی می‌کند. برای اینکه تست‌ها پاس شوند، باید کلاس خود را طوری بسازید که هر نوع ورودی، مثلاً Integer یا String را بپذیرد.

جنریک‌ها مفیدند، چون به شما امکان می‌دهند کدی کلی‌تر و قابل استفاده‌ی مجدد بنویسید. پیاده‌سازی‌های List و Map در جاوا هر دو نمونه‌هایی از کلاس‌هایی هستند که از جنریک استفاده می‌کنند. با استفاده از آن‌ها می‌توانید یک List بسازید که Integers را در خود داشته باشد، یا لیستی بسازید که Strings یا هر نوع دیگری را در خود جای دهد.

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

برای مثال می‌توانید لیستی از Integers بسازید:

List<Integer> someList = new LinkedList<>();

حالا someList فقط می‌تواند Integers را در خود داشته باشد. این کار را هم می‌توانید بکنید:

List<String> someOtherList = new LinkedList<>()

حالا someOtherList فقط می‌تواند Strings را در خود داشته باشد.

محدودیت دیگر این است که هر نوعی که با جنریک استفاده می‌شود نمی‌تواند یک نوع اولیه باشد، مثل int یا long. با این حال، هر نوع اولیه یک نوع ارجاعی متناظر دارد؛ پس به‌جای int می‌توانید از Integer و به‌جای long می‌توانید از Long استفاده کنید.

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


منبع

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

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

در Exercism ثبت‌نام کنید تا Java را همراه با 26 مفهوم158 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.