Leetcode 206 Reverse Linked List

Soru

Given the head of a singly linked list, reverse the list, and return the reversed list.

Örnek 1

image
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

Örnek 2

image
Input: head = [1,2]
Output: [2,1]

Örnek 3

Input: head = []
Output: []

Çözüm

  • Verilen tek yönlü bir bağlı listenin (linked list) elemanlarını ters çevirmenizi ister. Bu soru, verilen bir tek yönlü bağlı listenin düğümlerini ters sırayla düzenlemenizi ve ters çevrilen listenin başını (head) döndürmenizi gerektirir.
  • Girdi: Tek yönlü bir bağlı listenin baş düğümü (head).
  • Çıktı: Aynı liste, ancak düğümler ters sıralı.
  • Bu problem genellikle yinelemeli (iterative) veya özyinelemeli (recursive) yöntemlerle çözülür. Her iki yöntem de liste düğümlerinin işaretçilerini (pointers) tersine çevirerek çalışır.
  • Çalışma Mekanizması: Her iki çözüm de bağlı listenin düğümlerinin next işaretçilerini ters çevirerek listenin tersine çevrilmesini sağlar. Yinelemeli çözümde bu işlem bir döngü içinde, özyinelemeli çözümde ise özyinelemeli fonksiyon çağrılarıyla gerçekleştirilir.

Code

  • Yinelemeli Çözüm: Yinelemeli çözümde, mevcut düğümü işlerken bir önceki düğümü izlemek için bir değişken kullanılır. Bu değişken, düğüm bağlantılarını ters çevirmek için gereklidir.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def reverseList(self, head):
        prev = None
        current = head
        while current:
            next_node = current.next  # Sonraki düğümü sakla
            current.next = prev  # Mevcut düğümü ters çevir
            prev = current  # Önceki düğümü güncelle
            current = next_node  # İlerle
        return prev  # Yeni baş düğümü

  • Özyinelemeli Çözüm: Özyinelemeli çözümde, fonksiyon kendisini liste sonuna kadar çağırır ve geri dönüş yolunda düğüm işaretçilerini tersine çevirir.
class Solution:
    def reverseList(self, head):
        if not head or not head.next:
            return head  # Base case: Liste boş veya tek düğümlü
        p = self.reverseList(head.next)  # Liste sonuna kadar git
        head.next.next = head  # Ters çevirme işlemi
        head.next = None  # Eski baş düğümünü son düğüm yap
        return p  # Yeni baş düğümü


Complexity

  • Time complexity (Zaman Karmaşıklığı): Her iki çözüm için de O(n), burada n düğüm sayısıdır.
  • Space complexity (Alan Karmaşıklığı): Yinelemeli çözüm için O(1), çünkü sadece sabit miktarda ekstra alan kullanılır. Özyinelemeli çözüm için O(n), özyinelemeli çağrılar için çağrı yığınında n adet kayıt tutulur.