Leetcode/Top Interview 150

[LinkedList][Medium] 92. Reverse Linked List II

자전거통학 2024. 5. 26. 09:19

https://leetcode.com/problems/reverse-linked-list-ii/description

 

 

Q. list가 주어지고, left, right 가 주어질 때, 이 left, right만 list를 뒤집어라. 

 

 

Solution. 

 리스트 뒤집기 함수를 먼저 만든다, 그리고 연결 부분에 신경 쓴다. 

 

더보기

 

public class Solution {
    public ListNode ReverseBetween(ListNode head, int left, int right) 
    {
        --left; --right;
        int idx = 0;

        ListNode nodeResume = findNode(head, right+1);
        ListNode node = head;
        ListNode rHead, prev = null;
        while(node != null)
        {
            if(idx == left)
            {
                ListNode rTail = node;
                rHead = ReverseList(node, right-left+1);
                if(prev != null)
                    prev.next = rHead;
                
                rTail.next = nodeResume;
                head = idx>0 ? head : rHead;
                break;
            }

            prev = node;
            node = node.next;
            ++idx;
        }
        return head;
    }

    // 대상 index의 노드를 찾는다.
    ListNode findNode(ListNode head, int index)
    {
        int idx = 0;
        ListNode node = head;
        while(node != null)
        {
            if(idx == index)
                return node;
            
            ++idx;
            node = node.next;
        }
        return null;
    }

    // 특정 위치의 node에서 해당 수 만큼 뒤집는다.
    ListNode ReverseList(ListNode head, int count)
    {
        ListNode node = head;
        ListNode prev = null;
        
        if(count <= 0)
            return node;

        int cnt = 0;
        while(node != null)
        {
            ListNode next = node.next;
            node.next = prev;
            prev = node;
            node = next;

            ++cnt;
            if(cnt == count)    break;
        }
        
        return prev; 
    }
}

 

 적절한 결과.