Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.
Input: head = [1,2,3,4,5], left = 2, right = 4 Output: [1,4,3,2,5]
Input: head = [5], left = 1, right = 1 Output: [5]
The number of nodes in the list is n. 1 <= n <= 500 -500 <= Node.val <= 500 1 <= left <= right <= n
Could you do it in one pass?
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
node = head
node_list = []
while node is not None :
node_list.append(node.val)
node = node.next
reverse_list = node_list[left-1:right]
head = node_list[:left-1]
tail = node_list[right:]
reverse_list = list(reversed(reverse_list))
answers = head + reverse_list + tail
prev = None
while answers :
node = ListNode(answers.pop())
node.next = prev
prev = node
return node
이번 문제도 동일하게 파이썬 리스트로 변환하여 풀었다. 리스트로 변환하게 되면 슬라이싱을 통해 특정 위치의 배열을 뒤집는 것은 간단하기 때문에 리스트를 통해 답을 구하고 다시 배열리스트로 변경하여 답을 구했다.
class Solution:
def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
if not head or left == right :
return head
root = start = ListNode(None)
root.next = head
for _ in range(left-1) :
start = start.next
end = start.next
for _ in range(right - left):
tmp, start.next, end.next = start.next, end.next, end.next.next
start.next.next = tmp
return root.next
리스트로 바꾸는 편법(?)을 사용하지 않으면 배열 리스트로도 풀 수 있다. 다중할당을 통해 간결하게 풀 수도 있다.