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

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

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

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
	  // 如果k为1,直接输出该链表
        if (k == 1) return head;
	  // 给该链表加一个头节点
        ListNode res = new ListNode(-1);
        res.next = head;
        ListNode pre = res;
        ListNode cur = head;

        // 获取链表的长度
        int lenth = 0;
        while (cur != null) {
            lenth++;
            cur = cur.next;
        }

        if (lenth / k > 0) { // 如果该链表的长度大于或者等于要翻转的元素个数,则进行翻转
		  
		  // 重新赋值当前节点,因为求链表长度时,该节点的值发生了改变
            cur = pre.next;
            for (int i = 1; i < k * (lenth / k); i++) {
                if (i % k == 0) {
                    pre = cur; // 当前节点赋给前节点
                    cur = cur.next; // 当前节点的下一个节点是下一段要翻转的第一个节点
                    i++;
                }
                ListNode next = cur.next;
                cur.next = next.next;
                next.next = pre.next;
                pre.next = next;
            }
            return res.next;
        } else { // 如果翻转的元素个数大于该链表的长度,则不需要翻转
            return res.next;
        }
    }
}

全部评论

相关推荐

哇哇的菜鸡oc:他这不叫校招offer,而是实习offer
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务