리스트가 주어졌을 때 앞 - 뒤 노드 pair에서 값을 바꾸는 문제입니다.
Input : 리스트의 head
Output : pair 단위로 swap된 리스트
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur = head
while cur and cur.next:
cur.val, cur.next.val = cur.next.val, cur.val # swap
cur = cur.next.next # 다음다음 노드
return head
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
root = prev = ListNode(None)
prev.next = head
while head and head.next:
b = head.next
head.next = b.next
b.next = head
prev.next = b
head = head.next
prev = prev.next.next
return root.next
리스트가 주어졌을때 홀수 번째 노드들이 먼저 오고 짝수 번째 노드들이 나중에 오도록 리스트를 구성합니다. 이 때, 홀수 번째 노드들이나 짝수 번째 노드들 안에서의 순서는 주어진 리스트의 순서를 따르도록 합니다.
※ 착각한 것은 홀수 인덱스의 노드와 짝수 인덱스의 노드를 나누는 것이지 홀수값이 있는 노드와 짝수값이 있는 노드를 나누는 것이 아니다.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
root = odd = head
even_root = even = odd.next
while odd.next:
odd.next = odd.next.next
even.next = even.next.next
odd = odd.next
even = even.next
odd.next = even_root # 마지막 odd 노드에 even의 root를 이어준다
return root
리스트와 두 가지 인덱스 left와 right가 주어집니다. left번째 노드와 right번째 노드 사이의 노드들을 reverse 시킵니다.
Input : 리스트의 head, 왼쪽 인덱스 number, 오른쪽 인덱스 number
Output : left와 right 사이가 전반된 리스트
# 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: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
root = left_node = head
i = 1
while i < left: # left번째 node를 찾음
left_node = left_node.next
i += 1
while left < right:
right_node = left_node
for i in range(right - left): # right번째 node를 찾음
right_node = right_node.next
temp = left_node.val # swap
left_node.val = right_node.val
right_node.val = temp
left += 1
right -= 1
left_node = left_node.next
return root
# 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: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
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
풀이 1 | 풀이 2 | |
---|---|---|
runtime | 31ms | 48ms |