Futa Node ya Kati ya Linked List
Unahitaji kuondoa node ya kati kutoka kwenye singly linked list. Node ya kati ni node ya ⌊n / 2⌋-th kwa kutumia mfumo wa kuanzia 0 (0-based indexing).
Hivi ndivyo unavyoweza kuitatua kwa ufanisi.
Mkakati
Tumia viashiria (pointers) viwili ili kupata katikati kwa hatua moja.
- Tumia slow pointer inayotembea hatua moja kwa wakati mmoja.
- Tumia fast pointer inayotembea hatua mbili kwa wakati mmoja.
- Fast pointer inapofika mwisho, slow pointer itakuwa imefika katikati.
- Weka kiashiria (pointer) cha tatu ili kufuatilia node iliyo kabla ya slow pointer.
Mantiki
- Shughulikia hali ya kipekee (edge case). Ikiwa orodha ina node moja tu, rudisha null.
- Anzisha slow na fast pointers kwenye kichwa (head).
- Sogeza fast pointer hatua mbili na slow pointer hatua moja.
- Sasisha prev pointer ili ibaki hatua moja nyuma ya slow pointer.
- Baada ya mzunguko (loop) kuisha, unganisha prev node na node iliyo baada ya slow. Hii itairuka node ya kati.
Ugumu (Complexity)
- Time Complexity: O(n). Unapitia orodha mara moja tu.
- Space Complexity: O(1). Unatumia viashiria (pointers) vitatu pekee.
Utekelezaji wa 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;
}
Chanzo: https://dev.to/mdarifulhaque/2095-delete-the-middle-node-of-a-linked-list-4jf1