https://leetcode.com/problems/reverse-linked-list/

考え方としては、

1 → 2 → 3 → 4 → 5

1 ← 2 ← 3 ← 4 ← 5

とするように考える。

回答方法は iterative なやり方と recursive なやり方がある。 iterative なやり方は 2つの pointer を使う。

prev と curr

まず prev に None を設定する。 curr は head にする

Null → 1 → 2 → 3 → 4 → 5  ↑ ↑ prev curr

ループしている間 Linked List の 矢印の向き (curr.next) をずらしつつ、prev と next の pointer もずらしていく。

Null ← 1 → 2 → 3 → 4 → 5 → Null ↑ ↑ prev curr

Null ← 1 ← 2 → 3 → 4 → 5 → Null ↑ ↑ prev curr

Null ← 1 ← 2 ← 3 → 4 → 5 → Null ↑ ↑ prev curr

Null ← 1 ← 2 ← 3 ← 4 → 5 → Null ↑ ↑ prev curr

Null ← 1 ← 2 ← 3 ← 4 ← 5 → Null ↑ ↑ prev curr

curr が Null になりループを抜けるので、 最後に head を prev に設定する。

Time complexity: O(n) Mem complexity: O(1)

# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        prev = None
        curr = head

        while curr:
            nxt = curr.next
            curr.next = prev
            prev = curr
            curr = nxt
        return prev

recursive

head: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 5, next: None}}}}} head: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 5, next: None}}}} head: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 5, next: None}}} head: ListNode{val: 4, next: ListNode{val: 5, next: None}} head: ListNode{val: 5, next: None}

head: ListNode{val: 4, next: ListNode{val: 5, next: None}} reversedListHead: ListNode{val: 5, next: None}

head: ListNode{val: 4, next: None} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: None}}

head: ListNode{val: 3, next: ListNode{val: 4, next: None}} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: None}}

head: ListNode{val: 3, next: None} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: ListNode{val: 3, next: None}}}

head: ListNode{val: 2, next: ListNode{val: 3, next: None}} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: ListNode{val: 3, next: None}}}

head: ListNode{val: 2, next: None} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: ListNode{val: 3, next: ListNode{val: 2, next: None}}}}

head: ListNode{val: 1, next: ListNode{val: 2, next: None}} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: ListNode{val: 3, next: ListNode{val: 2, next: None}}}}

head: ListNode{val: 1, next: None} reversedListHead: ListNode{val: 5, next: ListNode{val: 4, next: ListNode{val: 3, next: ListNode{val: 2, next: ListNode{val: 1, next: None}}}}}

Time complexity: O(n) Mem complexity: O(n)