Loading

LeetCode 25 K个一组翻转链表

LeetCode25 K个一组翻转链表

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

样例

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

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

算法分析

  • 一个指针p
  • 判断后面节点是否够k
    • 内部反向
    • 外部反向

image-20201029151056623.png

内部反向细节

image-20201029154959390.png

外部反向细节

image-20201029154935694.png

最后记得往后走p=c

p指向下一组的前一个元素

时间复杂度\(O(n)\)

Java代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;


        for(ListNode p = dummy;;){
            //1. 判断够不够k个
            ListNode q = p;
            for(int i = 0; i < k && q != null; i++) q = q.next;
            if(q == null) break;

            // 内部翻转
            ListNode a = p.next;
            ListNode b = a.next;
            for(int i = 0; i < k -1; i ++){
                ListNode c = b.next; //记录
                b.next = a;//步骤1
                a = b; //更新1
                b = c; //更新2
            }

            //外部翻转 
            ListNode c = p.next;  //记录
            p.next = a; // 步骤1
            c.next = b; //步骤2

            p = c; //更新
        }

        return dummy.next;
    }
}
posted @ 2020-10-29 16:08  想用包子换论文  阅读(75)  评论(0编辑  收藏  举报