Skip to content

[Leetcode] 25. Reverse Nodes in k-Group โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

k๊ฐœ์˜ ๋…ธ๋“œ๋“ค๋งˆ๋‹ค ํ•ด๋‹น ๋…ธ๋“œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘์–ด ๋‚˜์—ดํ•˜๋Š” ๋ฌธ์ œ

Solution โ€‹

  1. ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ๋นˆ preHead ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค (head๋ฅผ ๊ฐ€๋ฅดํ‚ด).
  2. ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ถ€ํ„ฐ k๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ reverseํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•˜๋ฉด์„œ ๊ฐ ๋…ธ๋“œ๋ฅผ ๋ฐฐ์—ด์— ๋ณด๊ด€ํ•ด๋‘”๋‹ค.
    • ์ด๋•Œ ๋งˆ์ง€๋ง‰๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค.
  3. ๋ฐฐ์—ด์„ ๋’ค์ง‘์€๋‹ค์Œ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
  4. ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋งŒ๋“ค๊ณ , ๋’ค์ง‘ํžŒ ๋งˆ์ง€๋ง‰๋…ธ๋“œ๊ฐ€ ์ด์ „์— ์ €์žฅํ•ด๋‘” ์›๋ž˜ ๋งˆ์ง€๋ง‰๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋กํ•œ๋‹ค.
  5. ๋’ค์ง‘๋Š”๋ฐ k๋งŒํผ ๋ฐฐ์—ด์— ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ์‹คํ–‰์„ ์ค‘์ง€ํ•œ๋‹ค.

JS Code โ€‹

javascript
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var reverseKGroup = function(head, k) {
    
    const preHead = new ListNode(0,head)
    let rear = preHead
    
    const reverseNode = (node) => {
        let mvNode = node
        let start = new ListNode()
        let end = null
        let pointer = start
        let arr = []
        
        for(let i = 0 ; i < k ; i++) {
            if (!mvNode) return node
            if (i === k-1) end = mvNode.next
            arr.push({...mvNode})
            mvNode = mvNode.next
        }
        
        arr.reverse().forEach(item => {
            if(!start.next) start.next = item
            pointer.next = item
            pointer = pointer.next
        })
        
        pointer.next = end
        
        return start.next
    }
    
    while(rear) {
        
        const temp = reverseNode(rear.next)
        // console.log(temp)
        if (!preHead.next) preHead.next = temp
        rear.next = temp
        for(let i = 0 ; i < k ; i++) {
            if (!rear) break
            rear = rear.next
        }
    }
    
    return preHead.next
};