Given the head
of a linked list and an integer val
, remove all the nodes of the linked list that has Node.val == val
, and return the new head.
Example 1:
Input: head = [1,2,6,3,4,5,6], val = 6
Output: [1,2,3,4,5]
Example 2:
Input: head = [], val = 1
Output: []
Example 3:
Input: head = [7,7,7,7], val = 7
Output: []
Constraints:
[0, $10^4$]
.1 <= Node.val <= 50
0 <= val <= 50
연결 리스트와 정수 val
이 주어졌을 때, 연결 리스트에서 노드의 값이 val
인것을 모두 제외한 연결 리스트를 반환하는 문제입니다.
연결 리스트를 순회하면서 노드 값이 val
와 같으면 제외를 하면저 진행하면 될 것으로 보입니다.
입출력을 살펴보겠습니다.
val
의 값은 1이상 50이하입니다.val
값을 제외한 연결 리스트를 반환합니다.문제 정의
주어진 연결 리스트에서 특정 값 val
을 가진 모든 노드를 제거하는 문제입니다. 결과로 반환되는 연결 리스트는 원래 순서를 유지해야 하며, 제거 대상이 없는 경우에는 원래 리스트 그대로 반환하면 됩니다.
입력 및 제약 조건
val
은 모두 1 이상 50 이하입니다.출력 조건
val
값을 가진 노드들이 제거된 새로운 연결 리스트를 반환합니다.해결 방법
val
과 동일한지 확인합니다.current.next
를 current.next.next
로 업데이트하여 수행할 수 있습니다.head
가 제거 대상인지 확인하는 로직을 별도로 처리합니다.val
값을 가진 노드를 제거합니다.시간 복잡도
그렇다면 dummy노드를 왜 활용하는지에 대한 의문이 들 수 있습니다.
왜 dummy
노드를 사용하는가?
head
)의 값이 삭제 대상(val
)이라면, 삭제 후 새로 시작하는 노드를 head
로 설정해야 합니다.dummy.next
를 반환하면 되므로 코드가 간단해집니다.dummy
를 사용하면 모든 노드를 동일한 방식으로 처리할 수 있습니다.방법 1: 더미 노드 활용
current
포인터를 통해 리스트를 순회하며 val
값과 동일한 노드를 제거합니다.next
를 반환합니다.방법 2: 더미 노드 미활용
head
노드가 val
과 같은 경우를 처리하며 리스트의 시작점을 조정합니다.current
포인터를 통해 순회하며 나머지 노드들을 제거합니다.방법 3: 재귀
head.next
를 업데이트하면서 val
값을 가진 노드를 제거합니다.head
를 반환합니다.# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
# 1. Linked List using dummy
def removeElements(self, head, val):
# https://leetcode.com/problems/remove-linked-list-elements/submissions/1469021357
"""
:type head: Optional[ListNode]
:type val: int
:rtype: Optional[ListNode]
"""
dummy = ListNode()
dummy.next = head
curr = dummy
while curr.next:
if curr.next.val == val:
curr.next = curr.next.next
else:
curr = curr.next
return dummy.next
current.next
의 값을 검사하여 val
에 해당하면 제거합니다.# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
# 2. Linked List not using dummy
def removeElements(self, head, val):
# https://leetcode.com/problems/remove-linked-list-elements/submissions/1469019847
"""
:type head: Optional[ListNode]
:type val: int
:rtype: Optional[ListNode]
"""
while head and head.val == val:
head = head.next
curr = head
while curr and curr.next:
if curr.next.val == val:
curr.next = curr.next.next
else:
curr = curr.next
return head
head
가 제거 대상인지 확인하고, 제거된 새로운 시작점을 설정합니다.current
포인터를 통해 리스트를 순회하며 노드를 제거합니다.# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
# # 3. Recursion
def removeElements(self, head, val):
"""
:type head: Optional[ListNode]
:type val: int
:rtype: Optional[ListNode]
"""
# base case
if not head:
return None
head.next = self.removeElements(head.next, val)
if head.val == val:
return head.next
return head
head.next
를 재귀적으로 업데이트하며 val
을 제거합니다.head
를 반환합니다.이번 문제는 연결 리스트의 구조를 활용하여 특정 조건에 따라 노드를 제거하는 방법을 익힐 수 있는 좋은 연습이었습니다.
핵심 아이디어:
학습 포인트:
테스트 코드를 실험할 수 있는 전체 코드는 다음 링크에서 확인할 수 있습니다.
읽어주셔서 감사합니다!