25. Reverse Nodes in k-Group

一、题目

  1、审题

    

  2、分析

    给一个链表,与一个数字 k,每次翻转链表中的 k 个结点,若剩下的结点个数不满 k 个,则不翻转。

 

二、解答

  1、思路:

    a、计算出总结点个数 total, 则需要翻转k个结点的总躺数为 total / k;

    b、循环实现翻转 k 个结点;其中翻转即为将后一个结点依次插入此次翻转的链表头;

    

/**
 * 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) {

        ListNode dummy = new ListNode(0);
        dummy.next = head;

        int total = 0;  // 总结点数
        while(head != null) {
            total++;
            head = head.next;
        }
        head = dummy.next;

        ListNode pre = dummy;
        ListNode next;

        int times = 1;
        while(times++ <= total / k) {   // 总共翻转 times 次 k 个结点
            int i = 1;      // 翻转 k 个结点, 只要head 前插入后边 k -1 个
            while(i++ < k) {
                next = head.next;
                head.next = next.next;  // 删除

                next.next = pre.next;       // 插入
                pre.next = next;

            }
            pre = head;
            head = head.next;

        }

        return dummy.next;
    }
}

 

 

  

 

posted @ 2018-08-05 09:05  skillking2  阅读(85)  评论(0编辑  收藏  举报