Leetcode 25. Reverse Nodes in k-Group

题目描述:就是在前一题翻转2个链表节点的题目上变成翻转k个位置。

题目链接:Leetcode 25. Reverse Nodes in k-Group

Example:

Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

代码如下

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null && k == 0){
            return head;
        }
        
        ListNode p = head;
        ListNode ans = new ListNode(0);
        ListNode nl = ans;
        while(p != null){
            int cnt = 0;
            ListNode newHead = null;    
            while(cnt < k && p != null){
                ListNode tmpn = p.next;  //翻转链表 必存节点
                p.next = newHead;
                newHead = p; // 翻转链表了 当cnt == k的时候就翻转成功了
                p = tmpn;  //移动 k次之后 是需要翻转的下一个结点
                cnt++;
            }
            if (cnt == k){
                nl.next = newHead;
                while(nl.next != null){
                    nl = nl.next;  // 最终又回到这个点
                }
            }else{
                    // 记录的时候已经改变了位置 所以直接翻转newHead结果就好了
                    ListNode nn = null;  //新头节点
                    while(newHead != null){
                        ListNode tt = newHead.next;
                        newHead.next = nn;
                        nn = newHead;
                        newHead = tt;  // 不断下移翻转
                    }
                    nl.next = nn;
                }
            
        }
        return ans.next;   
    }
}

参考链接


  • Leetcode 25. Reverse Nodes in k-Group