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

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

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

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     *
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here

        //为空返回null
        if(head==null){
            return null;
        }

        //只有一个元素直接返回
        if(head.next==null){
            return head;
        }

        //k为1说明不需翻转 直接返回
        if(k==1){
            return head;
        }
        //记录head
        ListNode start = head;
        
        //得出链表长度
        int size = 0;
        while (start != null) {
            start = start.next;
            size++;
        }

        //k大于长度不合理 直接返回原链表
        if(k>size){
            return head;
        }
        //此时恢复start指向
        start = head;
        
        //使head指向第一组元素最后一个元素
        //此时指向后 最后可以直接使用head返回
        //原链表已用start指向 所以原链表的数据不会丢失
        int n = k;
        while (n > 1) {
            head = head.next;
            n--;
        }

        ListNode tmp;
        tmp=head;
        n = k;
        //判断有多少组可以翻转
        int num = size / k;

        //用一个新结点指向start
        ListNode h = start;
        
        for (int i = 1; i <= num; i++) {

            //使h指向n个元素之后的元素 记录下此时的值
            while (n >= 1) {
                h = h.next;
                n--;
            }
            n = k;

            //进行翻转 并将反转后那一组的头结点进行返回
            ListNode ret = revers(start, k);
            
            //第一组翻转的数据不需连接
            //并且此时第一组翻转的第一个元素为原第一组最后一个元素
            //第二组之后的都需要与前面的组链接
            if (i != 1) {

                //tmp记录下了head 此操作得到新链表的末尾结点
                while (tmp.next!=null) {
                    tmp=tmp.next;
                 
                }
                //将末尾结点的next指向翻转的一组
                tmp.next = ret;

                //使start指向原链表的k个元素之后的元素
                start = h;
                
            }
        
        //使start指向原链表的k个元素之后的元素
        start = h;
        }

        //连接上最后的元素
        while(tmp.next!=null){
            tmp=tmp.next;
        }
        tmp.next=h ;
        return head;
    }
    public static ListNode revers(ListNode head, int k) {
        ListNode cur = head.next;
        ListNode curNext = cur.next;
        head.next = null;
        while (k > 1) {
            curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
            k--;
        }
        return head;
    }
}

全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务