حذف گره میانی یک لیست پیوندی
شما باید گره میانی را از یک لیست پیوندی تکگوشی حذف کنید. گره میانی، با استفاده از ایندکسگذاری مبتنی بر صفر، گره ⌊n / 2⌋-ام است.
در اینجا روش حل کارآمد آن آمده است.
استراتژی
از دو اشارهگر برای یافتن میانه در یک پیمایش استفاده کنید.
- از یک اشارهگر کند (slow pointer) استفاده کنید که در هر مرحله یک گام حرکت میکند.
- از یک اشارهگر سریع (fast pointer) استفاده کنید که در هر مرحله دو گام حرکت میکند.
- وقتی اشارهگر سریع به پایان برسد، اشارهگر کند در گره میانی قرار میگیرد.
- یک اشارهگر سوم برای ردیابی گره قبل از اشارهگر کند نگه دارید.
منطق
- حالتهای خاص را مدیریت کنید. اگر لیست تنها یک گره دارد، null را برگردانید.
- اشارهگرهای slow و fast را در گره سر (head) مقداردهی اولیه کنید.
- اشارهگر fast را دو گام و اشارهگر slow را یک گام حرکت دهید.
- یک اشارهگر prev را بهروزرسانی کنید تا یک گام پشت سر اشارهگر slow باقی بماند.
- پس از پایان حلقه، گره prev را به گره بعد از slow متصل کنید. این کار گره میانی را حذف میکند.
پیچیدگی
- پیچیدگی زمانی: O(n). شما لیست را یک بار پیمایش میکنید.
- پیچیدگی فضا: O(1). شما فقط از سه اشارهگر استفاده میکنید.
پیادهسازی PHP
function deleteMiddle(ListNode $head): ?ListNode
{
if ($head->next == null) {
return null;
}
$slow = $head;
$fast = $head;
$prev = null;
while ($fast !== null && $fast->next !== null) {
$prev = $slow;
$slow = $slow->next;
$fast = $fast->next->next;
}
$prev->next = $slow->next;
return $head;
}
منبع: https://dev.to/mdarifulhaque/2095-delete-the-middle-node-of-a-linked-list-4jf1