25. K个一组翻转链表

  • 题目描述:
    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

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

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

进阶:

你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

  • 示例:


    image.png
image.png
  • 解题思路:
    1.先设虚拟固定头结点dummy(0),指向头结点,并设cur和next指针,指向head节点,设pre=dummy.


    image.png

2.设k=3,链表每三个数一组进行翻转:
1)移动next指针到cur的下一位
next = cur.next;


image.png

2)当前cur指向此时next的下一位,即a从原来的指向b,转而指向c
cur.next = next.next;


image.png

3)此时next指针指向pre下一个节点(a),即b节点指向a节点(原来b是指向c的)
next.next = pre.next;


image.png

4)最后把pre指向此时的next节点,即pre->b
这时的链表为:
pre.next = next;


image.png

再进行下一轮循环:


image.png

此时就将a->b->c转换成c->b->a,下一个区间,pre来到a节点,cur来到d节点,循环下去即可。

代码如下:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0), pre = dummy, cur = head, next;
        dummy.next = head;
        int length = 0;
        while(head != null) {
            length++;
            head = head.next;
        }
        head = dummy.next;
        for(int i = 0; i < length / k; i++) {
            for(int j = 0; j < k - 1; j++) {
                next = cur.next;
                cur.next = next.next;
                next.next = pre.next;
                pre.next = next;
            }
            prev = cur;
            cur = pre.next;
        }
        return dummy.next;
    }
}

你可能感兴趣的:(25. K个一组翻转链表)