연결 리스트의 첫 번째 노드 head
값이 중복되는 모든 노드를 제거한 연결 리스트의 첫 번째 노드 반환
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
let res = new ListNode(null, head);
let prev = res;
let curr = head;
let left = null;
while (curr) {
let right = curr.next ? curr.next.val : null;
if (curr.val === left || curr.val === right) {
left = curr.val;
curr = curr.next;
} else {
left = curr.val;
prev.next = curr;
curr = curr.next;
prev = prev.next;
}
}
prev.next = curr;
return res.next;
};
첫 번째 노드가 삭제될 수도 있으므로 그 앞에 새 노드를 이어 붙여서 prev에 저장
curr 포인터를 사용하여 head부터 이동 시작
curr의 값과 curr 이전 혹은 다음 노드의 값과 같다면 curr만 이동하고
그렇지 않다면 prev도 같이 이동하게 되는데,
prev의 next를 curr로 변경한 다음 이동
이전 노드의 값을 확인하기 위해 매번 left에 curr의 값을 넣어주고 이동
즉, 중복이 있는 노드를 지나는 동안은 prev를 중복이 시작 되는 노드 이전으로 두고
중복이 끝나면 해당 노드로 next를 이어주는 것
마지막 노드까지 중복이어서 제거해야할 수 있으므로
한번 더 prev.next를 curr로 수정한 뒤 만들어 놓았던 빈 노드의 다음 노드를 반환
Accepted
Runtime 60ms (Beats 53.76%)
Memory 50.73MB (Beats 92.58%)
역시 노드 제거 + 이전 값과 비교를 위해서는 투 포인터를 사용해야 한다는 점을 고려하니 문제가 꽤 쉽게 풀렸다. 저번에는 빈 노드를 생성하지 않고 푸는 방법도 찾아봤는데 이번에는 그렇게까지는 못했다. 그래도 결과도 마음에 들고 코드도 깔끔하게 작성되어서 괜찮은 듯. ദ്ദി´ ꒳ ` )