美文网首页算法
25. K 个一组翻转链表

25. K 个一组翻转链表

作者: 红树_ | 来源:发表于2023-05-12 20:41 被阅读0次

或许不安或许迷惑,但迷雾遮挡不住前方的光亮,有梦可待。

参考25. K 个一组翻转链表

题目

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k **的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。


head = [1,2,3,4,5], k = 2
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

解题思路

  • 分段反转:每次反转k个节点并连接新的反转段。

分段反转

/**
 * 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) {
        //计算链表长度
        int len = 0;
        for(ListNode tmp = head;tmp!=null;tmp=tmp.next,len++);
        //枚举位置
        ListNode dummy = new ListNode(0,head),tmp = dummy;
        for(int i = 0; i + k - 1 < len;i+=k) {
            //反转[i,i+k-1]
            ListNode pre = null,cur = tmp.next;
            for(int m = 0; m < k; m++) {
                ListNode next = cur.next;
                cur.next = pre;
                pre = cur;
                cur = next;
            }
            //链接下一段开头
            ListNode tmpNext = tmp.next;
            tmp.next.next = cur;
            tmp.next = pre;
            tmp = tmpNext;
        }
        return dummy.next;
    }
}

复杂度分析

  • 时间复杂度:O(n),遍历两次链表。
  • 空间复杂度:O(1)

相关文章

网友评论

    本文标题:25. K 个一组翻转链表

    本文链接:https://www.haomeiwen.com/subject/vrqysdtx.html