题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        if (head == null){
            return null;
        }
        //len记录链表长度
        int len = 0;
        //eg用于遍历链表
        ListNode eg = head;
        while (eg != null){
             len++;
             eg = eg.next;
        }
        if (len < k){
        //如果长度小于k,返回当前链表
            return head;
        }
        int num = len / k;
        //ListNode用于标记每一组的第一个节点
        ListNode headeg = head;
        //eg用于记录每一组翻转后的最后一个节点
        eg = head;
        for (int i = 1; i <= num; i++){
        //为每一组的翻转做准备工作
            ListNode eg0 = headeg;
            ListNode eg1 = headeg.next;
            headeg.next = null;
            int egi = k;
            while(egi - 1!= 0){
            //对每一组进行翻转
                egi--;
                ListNode eg2 = eg1.next;
                eg1.next = headeg;
                headeg = eg1;
                eg1 = eg2;
            }
            if (i == 1){
   //移动头节点,使其指向翻转后的第一个节点,只能在第一次翻转时执行一次
                head = headeg;
            }else{
       //连接翻转后的前一组与翻转后的当前组
                eg.next = headeg;
                eg = eg0;
            }
            //连接翻转后的当前组与下一组
            eg0.next = eg1;
            //使headeg始终指向下一组的头节点
            headeg = eg1;
        }
       return head;
    }

主要思路是先获取链表长度,根据k值确定每一组有几个节点以及总共有几个组,然后从左往右依次操作链表中的节点。共遍历代码两次,一次用于记录链表长度,一次用于翻转链表。具体细节请看代码中的注释。

全部评论

相关推荐

海螺很能干:每次看到这种简历都没工作我就觉得离谱
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务