Löschen des mittleren Knotens einer verketteten Liste

Sie müssen den mittleren Knoten aus einer einfach verketteten Liste entfernen. Der mittlere Knoten ist der ⌊n / 2⌋-te Knoten unter Verwendung der 0-basierten Indizierung.

So lösen Sie dies effizient.

Die Strategie

Verwenden Sie zwei Zeiger, um die Mitte in einem Durchlauf zu finden.

Die Logik

  1. Behandeln Sie den Sonderfall. Wenn die Liste nur einen Knoten hat, geben Sie null zurück.
  2. Initialisieren Sie die langsamen und schnellen Zeiger am Kopf (head).
  3. Bewegen Sie den schnellen Zeiger zwei Schritte und den langsamen Zeiger einen Schritt vorwärts.
  4. Aktualisieren Sie einen prev-Zeiger, damit dieser einen Schritt hinter dem langsamen Zeiger bleibt.
  5. Sobald die Schleife endet, verbinden Sie den prev-Knoten mit dem Knoten nach dem langsamen Zeiger. Dadurch wird der mittlere Knoten übersprungen.

Komplexität

PHP-Implementierung

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;
}

Quelle: https://dev.to/mdarifulhaque/2095-delete-the-middle-node-of-a-linked-list-4jf1