Given the head
of a linked list, remove the nth
node from the end of the list and return its head.
Example 1:
Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]
Example 2:
Input: head = [1], n = 1
Output: []
Example 3:
Input: head = [1,2], n = 1
Output: [1]
Constraints:
sz
.1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
Follow up: Could you do this in one pass?
이 문제는 연결 리스트의 끝에서 n번째 노드를 제거하는 문제입니다. 문제의 목표는 해당 노드를 제거한 후, 수정된 연결 리스트를 반환하는 것입니다.
Example 1
Input:
head = [1, 2, 3, 4, 5], n = 2
Output:
[1, 2, 3, 5]
4
)를 제거합니다.Example 2
Input:
head = [1], n = 1
Output:
[]
1
)만 있으므로, 이를 제거한 후 리스트는 비어 있게 됩니다.Example 3
Input:
head = [1, 2], n = 1
Output:
[1]
2
)를 제거합니다.문제의 핵심은 끝에서 n번째 노드를 찾아 제거하는 것입니다.
연결 리스트의 길이를 파악한다면 구할 수 있습니다. 하지만 연결 리스트의 길이를 구할려면 무조건 연결 리스트를 한 번 순회한 후 다시 순회하면서 n번째를 찾아야 합니다.
더 효율적인 방법으로는 투 포인터를 사용하는 방법입니다.
두 개의 포인터를 n만큼 차이가 나도록 이동시켜, 두 포인터의 사이값을 반환하도록 하면 해결할 수 있습니다.
예를 들어, 첫번째 예시가 있습니다.
head = [1, 2, 3, 4, 5]
두 개의 포인터 s와 f가 있는데, f 포인터를 s보다 n만큼 앞에 위치시킨 다음에 계속 순회를 합니다. f포인트가 마지막까지 오게된다면 s포인트의 바로 다음 노드가 삭제할 노드에 위치하게 됩니다. 그림으로 표현하자면 다음과 같습니다.
dummy
노드 생성: 기존 리스트 앞에 가상의 노드를 추가하여 특별한 경우(헤드 삭제)를 처리.fast
와 slow
포인터를 dummy
로 초기화.fast
를 n+1
칸 이동:fast
와 slow
사이의 거리가 n
이 되도록 설정.fast
를 리스트 끝까지 이동하면서 slow
를 함께 이동.slow
는 제거할 노드의 이전 노드에 위치.slow.next = slow.next.next
로 nth
노드를 건너뜀.dummy.next
를 반환.# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
def removeNthFromEnd(self, head, n):
# https://leetcode.com/problems/remove-nth-node-from-end-of-list/submissions/1469890775
"""
:type head: Optional[ListNode]
:type n: int
:rtype: Optional[ListNode]
"""
dummy = ListNode(next=head)
s, f = dummy, dummy
for _ in range(n + 1):
f = f.next
while f:
s = s.next
f = f.next
s.next = s.next.next
return dummy.next
이 문제는 투 포인터 기법의 유용성을 보여주는 좋은 예제입니다. 두 포인터를 사용함으로써 리스트를 한 번만 순회하면서 효율적으로 문제를 해결할 수 있었습니다.
특히, dummy 노드를 활용한 방식은 헤드 노드가 제거되는 경우에도 일관된 방법으로 문제를 처리할 수 있어 매우 유용합니다. 향후 연결 리스트와 관련된 문제에서 자주 사용될 수 있는 기법입니다.
전체 코드는 다음 링크에서 확인할 수 있습니다.
읽어주셔서 감사합니다!