遙かなるマチョジニア

マッチョXエンジニアを目指すブログ

【LeetCode】Reverse a Linked List 解法【Python】

スポンサードリンク

Reverse a Linked List

leetcode.com

独自のリンクリストクラスを逆順にする問題。こういうのは現実問題として結構多いと思う。 解放としては、愚直にやるしかないって感じ。再帰使ったやりかたもあるが、可読性が下がるのであまり好きじゃない。

leetcodeの記述を前提としているのでヘルパークラスみたいな実装になっているが、 実際はリンクリストクラス自身にreverseをつけてもいいと思うんだが、どうなんだろ。

コード

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        
        if head is None:
            return None
 
        next_ = head.next
        pre_node = ListNode(val= head.val, next=None)
        if next_ is None:
            return pre_node
        
        while next_ is not None:

            val = next_.val
            nxt = pre_node
            rev_node = ListNode(val=val, next=nxt)
            
            pre_node = rev_node
            next_ = next_.next
            

        return rev_node

ちょっとコードが汚い。 headがNoneのときはいいとして、 headだけで終わっている場合(連結がない場合)のifは不要だと思うのできれいにできそう。

f:id:shuheilocale:20200612080951p:plain

solutionに書いてあったきれいなコード↓

class Solution:
# @param {ListNode} head
# @return {ListNode}
def reverseList(self, head):
    prev = None
    while head:
        curr = head
        head = head.next
        curr.next = prev
        prev = curr
    return prev