题解 | #链表中的节点每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) {
	  //创建一个 dummy 节点,并将其指向给定的链表头部 head,这样做是为了简化操作。
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
	  //初始化两个指针 pre 和 end,并且两者都指向 dummy 节点。
        ListNode pre = dummy;
        ListNode end = dummy;
        while (end.next != null) {
	//通过一个 for 循环,每次将 end 指针向后移动 k 步,直到找到需要翻转的区间的末尾节点或者链表已经遍历完
	//找到需要翻转的区间的末尾节点后,我们将其后面的部分保存在一个临时变量 next 中。然后我们将 end 节点
//的next 指针指向 null,这样做是为了切断当前区间与后面部分的连接
            for (int i = 0; i < k && end != null; i++) {
                end = end.next;
            }
            if (end == null) {
                break;
            }
            ListNode start = pre.next;
            ListNode next = end.next;
            end.next = null;
            pre.next = reverse(start);
		  //将 pre 指针移动到翻转后的区间的头部,将 end 指针也移动到 pre 指针所在的位置,然后继续下一轮循环
            start.next = next;
            pre = start;
            end = pre;
        }
	  //返回 dummy 节点的 next 指针,即为翻转后的链表头部。
        return dummy.next;
    }
  //翻转当前区间,将 pre 节点的 next 指针指向翻转后的区间头部,同时将翻转后的区间的末尾节点的 next 指针指向
//之前保存的 next
    private ListNode reverse(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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