25. K 个一组翻转链表 【@我的刷题日记】

该问题涉及对链表进行操作,每k个节点一组进行翻转。算法首先确定需要翻转的末尾节点,然后使用迭代法反转这个子链表,并将其连接回原链表。当链表长度不是k的整数倍时,剩余部分保持原样。提供的代码实现包括两个辅助函数,一个用于反转链表,另一个用于处理整个翻转过程。
摘要由CSDN通过智能技术生成

25. K 个一组翻转链表

难度:困难                日期:2023年6月10日

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

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

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

示例 1:

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

示例 2:

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

方法:模拟

//这里反转链表会将原本链表之后的节点接到反转后的末尾节点之后
var reverseList = function(cur,tail) {
    let pre = tail;
    while(cur != tail){
        let next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre
};
var reverseKGroup = function(head, k) {
    if(k==1 || head.next==null) return head;
    let cur = head;
    let result = new ListNode(0,null);
    let mask = result;
    
    while(cur && cur.next != null){
        let n = k;
        //确定需要反转的末尾节点
        while(cur.next != null && n > 1){
            cur = cur.next;
            n--;
        }
        if(n==1) {
            //将翻转后的链表加入到返回链表之后
            mask.next = reverseList(head,cur.next);
            mask = head; //将mask更新到返回链表末尾
            head = head.next;cur = head;  //更新需要反转的链表范围
        }
    }
    return result.next
};

结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值