ਇੱਕ Linked List ਦੇ ਵਿਚਕਾਰਲੇ ਨੋਡ (Middle Node) ਨੂੰ ਡਿਲੀਟ ਕਰੋ

ਤੁਹਾਨੂੰ ਇੱਕ singly linked list ਵਿੱਚੋਂ ਵਿਚਕਾਰਲੇ ਨੋਡ ਨੂੰ ਹਟਾਉਣ ਦੀ ਲੋੜ ਹੈ। 0-ਅਧਾਰਤ ਇੰਡੈਕਸਿੰਗ (0-based indexing) ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ, ਵਿਚਕਾਰਲਾ ਨੋਡ ⌊n / 2⌋-ਵਾਂ ਨੋਡ ਹੁੰਦਾ ਹੈ।

ਇੱਥੇ ਇਸਨੂੰ ਕੁਸ਼ਲਤਾ ਨਾਲ ਹੱਲ ਕਰਨ ਦਾ ਤਰੀਕਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।

ਰਣਨੀਤੀ (The Strategy)

ਇੱਕ ਹੀ ਪਾਸ (one pass) ਵਿੱਚ ਵਿਚਕਾਰਲਾ ਨੋਡ ਲੱਭਣ ਲਈ ਦੋ ਪੁਆਇੰਟਰਾਂ (pointers) ਦੀ ਵਰਤੋਂ ਕਰੋ।

ਤਰਕ (The Logic)

  1. ਐਜ ਕੇਸ (edge case) ਨੂੰ ਸੰਭਾਲੋ। ਜੇਕਰ ਲਿਸਟ ਵਿੱਚ ਸਿਰਫ਼ ਇੱਕ ਨੋਡ ਹੈ, ਤਾਂ null ਰਿਟਰਨ ਕਰੋ।
  2. slow ਅਤੇ fast ਪੁਆਇੰਟਰਾਂ ਨੂੰ head 'ਤੇ ਇਨੀਸ਼ੀਅਲਾਈਜ਼ (initialize) ਕਰੋ।
  3. fast pointer ਨੂੰ ਦੋ ਕਦਮ ਅਤੇ slow pointer ਨੂੰ ਇੱਕ ਕਦਮ ਚਲਾਓ।
  4. slow pointer ਤੋਂ ਇੱਕ ਕਦਮ ਪਿੱਛੇ ਰਹਿਣ ਲਈ ਇੱਕ prev ਪੁਆਇੰਟਰ ਨੂੰ ਅਪਡੇਟ ਕਰੋ।
  5. ਜਦੋਂ ਲੂਪ ਖਤਮ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ prev ਨੋਡ ਨੂੰ slow ਤੋਂ ਬਾਅਦ ਵਾਲੇ ਨੋਡ ਨਾਲ ਜੋੜ ਦਿਓ। ਇਹ ਵਿਚਕਾਰਲੇ ਨੋਡ ਨੂੰ ਛੱਡ ਦੇਵੇਗਾ।

ਜਟਿਲਤਾ (Complexity)

PHP ਇੰਪਲੀਮੈਂਟੇਸ਼ਨ (PHP Implementation)

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