티스토리 뷰
Problem
You are given the head of a linked list, and an integer k.
Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node from the end (the list is 1-indexed).
Example 1:
Input: head = [1,2,3,4,5], k = 2
Output: [1,4,3,2,5]
Example 2:
Input: head = [7,9,6,6,7,8,3,0,9,5], k = 5
Output: [7,9,6,6,8,7,3,0,9,5]
Constraints:
- The number of nodes in the list is n.
- 1 <= k <= n <= 10^5
- 0 <= Node.val <= 100
Solution
연결 리스트와 정수 k가 주어질 때 처음부터 k번째 원소와 뒤에서부터 k번째 원소를 swap하는 문제입니다.
import io.lcalmsky.leetcode.ListNode;
public class Solution {
public ListNode swapNodes(ListNode head, int k) {
k = k - 1;
ListNode forward = head;
while (k > 0) { // (1)
forward = forward.next;
k--;
}
ListNode remain = forward; // (2)
ListNode backward = head; // (3)
while (remain.next != null) { // (4)
backward = backward.next;
remain = remain.next;
}
// (5)
int temp = forward.val;
forward.val = backward.val;
backward.val = temp;
return head;
}
}
- 앞쪽 방향으로 진행하면서 k 번째 원소를 찾습니다.
- k번째부터 앞쪽 방향으로 이동할 노드입니다.
- 뒤쪽에서부터 k번째 원소를 찾기 위한 노드 입니다.
- 2번의 노드를 끝까지 이동시키는동안 3번의 노드도 같이 이동시킵니다. 그럼 뒤에서 k번째 노드를 구할 수 있습니다.
- 두 노드를 swap해 줍니다.
Test
package io.lcalmsky.leetcode.swapping_nodes_in_a_linked_list;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import io.lcalmsky.leetcode.ListNode;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
void testAll() {
assertAll(
() -> test(ListNode.of(1, 2, 3, 4, 5), 2, ListNode.of(1, 4, 3, 2, 5)),
() -> test(ListNode.of(7, 9, 6, 6, 7, 8, 3, 0, 9, 5), 5,
ListNode.of(7, 9, 6, 6, 8, 7, 3, 0, 9, 5))
);
}
private void test(ListNode head, int k, ListNode expected) {
// when
Solution solution = new Solution();
ListNode actual = solution.swapNodes(head, k);
// then
assertEquals(expected, actual);
}
}
ListNode.java 전체 보기
package io.lcalmsky.leetcode;
import java.util.Objects;
public class ListNode {
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
public static ListNode of(int... integers) {
if (integers == null || integers.length == 0) throw new IllegalArgumentException();
ListNode head = new ListNode(0);
ListNode last = head;
ListNode p;
for (int integer : integers) {
p = new ListNode(integer);
last.next = p;
last = last.next;
}
return head.next;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ListNode)) return false;
ListNode listNode = (ListNode) o;
return val == listNode.val &&
Objects.equals(next, listNode.next);
}
@Override
public int hashCode() {
return Objects.hash(val, next);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
923. 3Sum With Multiplicity (0) | 2022.04.18 |
---|---|
11. Container With Most Water (0) | 2022.04.16 |
881. Boats to Save People (0) | 2022.04.09 |
74. Search a 2D Matrix (0) | 2022.04.08 |
287. Find the Duplicate Number (0) | 2022.04.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Java
- 스프링 데이터 jpa
- proto3
- r
- 알고리즘
- spring boot application
- JSON
- Spring Boot Tutorial
- Linux
- @ManyToOne
- 클린 아키텍처
- Spring Boot
- gRPC
- 스프링부트
- spring boot jwt
- Spring Boot JPA
- 헥사고날 아키텍처
- Jackson
- spring boot app
- JPA
- QueryDSL
- 함께 자라기 후기
- 스프링 부트 애플리케이션
- Spring Data JPA
- 함께 자라기
- 스프링 부트
- 스프링 부트 튜토리얼
- 스프링 부트 회원 가입
- intellij
- leetcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함