25. K个一组翻转链表

25. K个一组翻转链表

Scroll Down

K个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回:3->2->1->4->5

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

思路

官方解答

解答

/**
 * 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 newHead = new ListNode(0);
        newHead.next = head;

        ListNode begin = newHead, end = newHead;
        while (head != null) {
            int count = 0;
            while (count++ < k && end != null) {
                end = end.next;
            }

            if (end == null) break;
            
            ListNode t1 = begin.next, t2 = end.next;
            end.next = null;
            begin.next = reverseNode(t1);
            t1.next = t2;
            
            begin = t1;
            end = begin;
        }

        return newHead.next;
    }

    private ListNode reverseNode(ListNode node) {
        ListNode cur = null;
        while (node != null) {
            ListNode next = node.next;
            node.next = cur;
            cur = node;
            node = next;
        }
        return cur;
    }
}