[Leetcode] 25. Reverse Nodes in k-Group


Problem
質問リンク
各kノードの順序が逆転する問題
Solution
  • の最初のノードを指す空のpreHeadノード(headを指す)が生成される.
  • の最初のノードから、ノードを移動してk個のノードを反転させ、各ノードをアレイに配置する.
  • このとき最後のノードが指すノードを覚えておいてください.
  • 配列を反転した後、各ノードの指向を反転させる.
  • 開始ノードはステアリングノードを示し、反転された最後のノードは、以前に保存された最後のノードが示すノードを示す.
  • を反転し、kのように配列を入れることができない場合は、実行を停止します.
  • JS Code
    /**
     * 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
    };
    質問する