[LeetCode][Java]Reverse Nodes in k-Group

최지수·2021년 11월 24일
0

Algorithm

목록 보기
27/77
post-thumbnail

문제

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes, in the end, should remain as it is.

You may not alter the values in the list's nodes, only nodes themselves may be changed.

제한사항

  • The number of nodes in the list is in the range sz.
  • 1 \leq sz \leq 5000
  • 0 \leq Node.val \leq 1000
  • 1 \leq k \leq sz

Follow-up: Can you solve the problem in O(1) extra memory space?

접근

링크드 리스트와 정수 k가 주어졌을 때 k 묶음만큼 역전시킨 링크드 리스트를 반환하는 문젭니다.

링크드 리스트의 포인터를 얼마나 잘 관리하냐가 관건이었습니다.

저 같은 경우엔,

  1. 현재 묶음 링크드 리스트 기준 이전 노드, 역전 이후 마지막 노드(바꾸기 전 첫번째 노드), 다음 묶음의 첫번째 링크드 리스트를 저장
  2. 해당 묶음 '역전'
  3. 이전 노드 next에 역전 결과 링크드 리스트 저장
  4. 역전 이후 마지막 노드 next에 다음 묶음의 첫 번째 링크드 리스트를 초기화

하는 방식을 전개했습니다.

결과는 안정적으로 잘 나왔습니다.

답안

/**
 * 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 reverseKGroup(ListNode head, int k) {
        if(null == head || null == head.next || k == 1)
            return head;

        ListNode lastNode = head;
        ListNode nextPeriodNode = getNode(head, k + 1);
        ListNode ret = getReversedNode(head, k);

        lastNode.next = nextPeriodNode;

        ListNode curNode = nextPeriodNode;
        while(null != curNode){
            ListNode prevNode = lastNode;
            lastNode = curNode;
            nextPeriodNode = getNode(curNode, k + 1);

            ListNode reversedNode = getReversedNode(curNode, k);
            if(null == reversedNode)
                break;

            prevNode.next = reversedNode;
            lastNode.next = nextPeriodNode;

            curNode = nextPeriodNode;
        }


        return ret;
    }

    /**
     *
     * @param head
     * @return reverse 이후 첫번째 노드
     */
    ListNode getReversedNode(ListNode head, int k){
        if(null == head)
            return null;

        if(1 == k)
            return head;

        ListNode curNode = head;
        for(int i = 1; i <= k; ++i){
            if(null == curNode)
                return null;
            curNode = curNode.next;
        }

        ListNode prevNode = null;
        curNode = head;
        ListNode nextNode = null;
        for(int i = 1; i <= k ; ++i){
            nextNode = curNode.next;
            curNode.next = prevNode;
            prevNode = curNode;
            curNode = nextNode;
        }
        head.next = null;
        return prevNode;
    }

    ListNode getNode(ListNode head, int k){
        if(null == head)
            return null;

        ListNode node = head;
        for(int i = 1; i < k; ++i){
            if(null == node)
                return null;
            node = node.next;
        }

        return node;
    }
}
profile
#행복 #도전 #지속성

0개의 댓글