728x90
leetcode.com/problems/remove-nth-node-from-end-of-list/
1️⃣ head = null 이라면 return null
2️⃣ n == 1 일 경우 (맨 뒤의 노드 삭제)
3️⃣ n == 2 일 경우 (뒤에서 두번째 노드 삭제) : next.next가 없기때문에 따로 진행
*️⃣ 그 외
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head.next == null){
return null;
}
ListNode front = head;
ListNode node = head;
int cnt = 1;
while(head.next != null){
cnt++;
head = head.next;
}
int nth = 0;
while(node.next != null){
if(n == 1 && node.next == head){
node.next = null;
return front;
}
int nthFromEnd = cnt - nth;
if (nthFromEnd == n){
node.val = node.next.val;
if(n == 2){
node.next = null;
return front;
}
node.next = node.next.next;
}
node = node.next;
nth++;
}
return front;
}
}
while 문을 돌고나면 head가 맨 뒤의 노드가 되므로, 온전한 맨 앞 노드값을 저장하기 위한 front 변수를 생성한다. (return 에 사용할 것임) 그리고 while문에 사용하기위해 ListNode 변수 node를 하나 더 생성한다.
cnt = 노드의 개수를 세는 변수
주어진 head의 다음 노드가 없을 때까지 cnt를 더해서 노드의 개수를 센다.
2️⃣ n == 1 이고 node의 다음이 head와 같다면, 즉 다음 노드가 마지막 노드라면, 마지막 노드를 null로 없앤 후, 리턴한다.
3️⃣ 아니라면 뒤에서 nth 번째 인것을 세기 위해 nthFromEnd 변수로 몇번째 변수인지 파악한다.
cnt 값은 처음에 노드의 개수이기 때문에 조건이 [1,2,3,4] n=2 일경우, cnt = 4 이고 nthFromEnd 는 차례대로 4, 3, 2, 1이 된다. 이 경우, 뒤에서 두번 째 노드와 마지막 노드의 val 값을 바꾸고, 마지막 노드를 없앤 후, 리턴한다.
*️⃣ n이 1이나 2가 아니라면 next.next가 존재하므로 node.next 와 node.next.next를 변경한다.
728x90
'코딩테스트' 카테고리의 다른 글
[LeetCode] 141. Linked List Cycle (0) | 2021.05.06 |
---|---|
[LeetCode] Palindrome Linked List (0) | 2021.05.06 |
[LeetCode] Delete Node in a Linked List (0) | 2021.05.06 |
[LeetCode] Binary Tree Level Order Traversal (2) | 2021.05.03 |
[LeetCode] 101. Symmetric Tree (0) | 2021.04.29 |