(耗时巨久)leetcode 25 K 个一组翻转链表

博客围绕链表每k个节点一组进行翻转展开,要求返回翻转后的链表,k为正整数且小于等于链表长度,若节点总数非k整数倍,剩余节点保持原有顺序。算法需用常数额外空间,要实际交换节点。还给出执行结果,并提及分组时易越界及相似题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

示例 :

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

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

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

说明 :

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

执行结果:

通过

显示详情

执行用时 :116 ms, 在所有 Java 提交中击败了5.91% 的用户

内存消耗 :43 MB, 在所有 Java 提交中击败了6.83%的用户

 

短期内我不想再看这道题了我哭,翻转的函数倒是很好做,主要是分组的时候 无数个越界

/**
 * 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 p = head;
        //first保存了翻转后的链表的头节点
        ListNode first = head;
        //如果节点数小于K,直接返回原数组
        for(int i=0; i<k; i++){
            if(p == null)
                return head;
            p = p.next;
        }
        first = Reverse(head, p);
       
        
        //cur作为已经翻转好的部分的遍历指针
        ListNode cur = first; 
        boolean pIsNull = false;
        while(p != null ){
            System.out.println(p.val);
            //tmpp暂存当前正在遍历的节点,即为每组(<=k个节点为一组)的第一个节点
            ListNode tmpp = p;
            for(int i = 0; i<k ; i++){
                System.out.println(i+",    "+cur.val);
                if(p == null){
                    //该组节点值<k
                    while(i < k-1 ){
                        //让cur循环到翻转好的部分的最后一个元素
                        cur = cur.next; 
                        i++;
                        System.out.println(i+","+cur.val);
                    }
                    cur.next = tmpp;
                    pIsNull = true;
                    break;
                }
                //p最终指向该组最后一个节点的下一个节点,即下一组的第一个结点
                p = p.next;
                //注意这里让cur最终指向的是已经翻转好的部分的最后一个节点
                if(i != k-1)
                    cur = cur.next;
            }
            if(pIsNull)
                break;
            cur.next = Reverse(tmpp, p);
            cur = cur.next;
        }
        return first;
    }
    //head是待逆序组的第一个节点,tail是该组最后一个节点的下一个节点
    public ListNode Reverse(ListNode head, ListNode tail){
        System.out.println("yes");
        ListNode p = head;
        //tmphead是每组交换的临时假头结点,每组交换后的数组即为tmphead.next;
        //每遍历一个节点,将其插在tmphead节点之后,即能起到倒序的作用;
        ListNode tmphead = new ListNode(-1);
        while(p != tail ){
            //保存正在生成的倒序链表的临时的真正头结点
            ListNode tmp = tmphead.next;
            //将正在遍历的节点插在假头结点的后面
            tmphead.next = p;
            //next暂存下一个要遍历的节点
            ListNode next = p.next;
            p.next = tmp;
            
            p = next;
        }
        return tmphead.next;
    }
}

相似题目:leetcode24. 两两交换链表中的节点 java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值