코딩 테스트 및 알고리즘/Grind 75 (Blind 75 Leetcode Questions)
LinkedList : Reverse Linked List
띠리링구
2024. 1. 9. 21:59
https://leetcode.com/problems/reverse-linked-list/description/
Reverse Linked List - LeetCode
Can you solve this real interview question? Reverse Linked List - Given the head of a singly linked list, reverse the list, and return the reversed list. Example 1: [https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg] Input: head = [1,2,3,4,5] O
leetcode.com
linked list를 뒤집는 문제다.
리스트를 순회하면서 각 노드가 가리키는 값을 이전 노드로 바꿔야된다.
그러므로 노드를 순회할 변수와 그 이전 노드를 저장할 변수가 필요하다.
# 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: Optional[ListNode]) -> Optional[ListNode]:
if not head:
return head
prev = None
cur = head
while cur and cur.next:
nxt = cur.next
cur.next = prev
prev = cur
cur = nxt
cur.next = prev
return cur
시간 복잡도는 O(N)
공간 복잡도는 O(1)
# 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: Optional[ListNode]) -> Optional[ListNode]:
def rec(node, prev):
node_next = node.next
node.next = prev
if not node_next: return node
return rec(node_next, node)
return None if head is None else rec(head, None)
recursive solution이다.
재귀 콜스택때문에 공간복잡도가 O(N)으로 늘었다.
다른 사람들의 많은 투표를 받은 솔루션은 어떨까?
1. Iterative 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
2. Recursive Solution
class Solution:
# @param {ListNode} head
# @return {ListNode}
def reverseList(self, head):
return self._reverse(head)
def _reverse(self, node, prev=None):
if not node:
return prev
n = node.next
node.next = prev
return self._reverse(n, node)