https://leetcode.com/problems/rotate-list/description/
코드설명
구현(Implementation) 문제입니다.
1. 먼저 head의 전체 Size를 구합니다. (k값이 num값보다 클 수 있기에, MOD 연산을 통해서 순환버퍼 형식으로 생각해야 합니다.)
2. k만큼 먼저 kNode를 움직입니다. (이떄 Point는 dummyNode에서부터 kNode가 시작되어 움직입니다.)
3. kNode가 마지막 노드일떄까지 움직이되, nowNode도 dummyNode에서 kNode와 함께 움직입니다.
4. 해당 nowNode 위치에서 연결하고, 연결을 끊어주면 됩니다. 그리고 마지막 부분은 첫번쨰 부분은 다시 head를 바라보도록 처리해야합니다.
코드
정답코드1입니다.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || k == 0) return head;
ListNode dummy = new ListNode(-999, head);
int listSize = 0;
ListNode kNode = dummy;
while(kNode.next != null){
kNode = kNode.next;
listSize++;
}
ListNode now = dummy;
kNode = dummy;
if(listSize > 0)
k = k % listSize;
if(k == 0) return head;
for(int i=0; i<k; i++){
kNode = kNode.next;
}
while(kNode.next != null){
now = now.next;
kNode = kNode.next;
}
ListNode nextNode = now.next;
now.next = null;
kNode.next = head;
return nextNode;
}
}
처음에 작성한 코드입니다.
로직은 많지만, 정돈되지 않았습니다.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
ListNode dummy = new ListNode(-999, head);
int listSize = 0;
ListNode kNode = dummy;
while(kNode.next != null){
kNode = kNode.next;
listSize++;
}
if(listSize - 1 == 0 || listSize == 0 || k == 0) return head;
ListNode now = dummy;
kNode = dummy;
if(listSize > 0)
k = k % listSize;
if(k == 0) return head;
for(int i=0; i<k; i++){
kNode = kNode.next;
}
while(kNode.next != null){
now = now.next;
kNode = kNode.next;
}
ListNode nextNode = now.next;
now.next = null;
kNode.next = head;
return nextNode;
}
}