Programming/leetcode
92. Reverse Linked List II
홍열
2021. 2. 15. 23:39
728x90
이 문제는 책에 나와 있는 풀이는 어려운편인것 같다. (내 이해도가 문제인가)
Linked List문제는 손으로 그려보면 답은 보인다.
이 문제 역시 책으로 이해하려고 해보다가 손으로 그려서 해결한 문제이다.
특정 범위가 주어지고, 그 범위 안에 있는 Linked List를 뒤집는 문제이다.
1) Reverse 후에 앞, 뒤 연결은 어떻게 할것인가?
2) Reverse는 어떤 방법으로 할것인가?
2번 질문부터 답해보자,
-> 나는 head앞에 prev라는 Linked List를 두고 기억하게 했다.
1번에 대해서는 cnt라는 변수를 두어, 세어 나가면서 m과 같을때 prev.next 를 reverse된 Linked List와 연결 시켰다.
code는 더러운 편이다
def reversebetween(self, head:ListNode, m:int, n:int) -> ListNode:
# 뒤집기 함수
def getReverse(h:ListNode, c:int)->ListNode:
node, prev = h, None
# c1은 뒤집기를 위해서 사용하고, c2는 추후 마지막을 연결하기 위해서 사용
c1 = c
c2 = c
# 2->3->4에서 4의 연결부를 기억하기 위해서 사용
tail = ListNode(None)
while c1 >= 0:
# 마지막이면 연결부를 기억하자
if c1 == 0:
tail = node.next
# 뒤집기...next라는 임시 변수를 통해서 뒤집자
next, node.next = node.next, prev
prev, node = node, next
c1 -= 1
# 맨 마지막을 연결시켜주기 위해서 사용
p1 = prev
while c2 >= 0:
if c2 == 0:
p1.next = tail
p1 = p1.next
c2 -= 1
return prev
# head보다 앞선 것을 하나 두고, 이전 값을 기억하자.
root = prev = ListNode(None)
prev.next = head
root.next = head
cnt = 1
while head:
if cnt == m:
prev.next = getReverse(head, n-m)
break
cnt += 1
prev = prev.next
head = head.next
return root.next