[leetcode题目解答]--(25) K个一组翻转链表

Author:赵志乾
Date:2020-02-22
Declaration:All Right Reserved!!!
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

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

链表节点:
public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int x) { val = x; }
}
// 解法1
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // step1: 增加哑节点简化代码
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        // step2: 外层标志量
        ListNode curNode = dummyNode.next;
        ListNode curPre = dummyNode;
        // step3: 循环处理
        while(shouldReverse(curNode,k)){
            // step3.1: 内层反转标志量
            ListNode innerPre = curNode;
            ListNode innerCur = curNode.next;
            // step3.2: 内层反转
            for(int index=0;index<k-1;index++){
                ListNode innerNext = innerCur.next;
                innerCur.next = innerPre;
                innerPre = innerCur;
                innerCur = innerNext;
            }
            // step3.3: 完成反转
            curPre.next = innerPre;  
            curNode.next = innerCur;
            // step3.4: 外层迭代
            curPre = curNode;
            curNode = curNode.next;
        }
        return dummyNode.next;
    }

    private boolean shouldReverse(ListNode head, int k){
        if(head==null){
            return false;
        }
        ListNode curNode = head;
        for(int index=0; index<k; index++){
            if(curNode==null){
                return false;
            }
            curNode = curNode.next;
        }
        return true;
    }
}

注:链表类题目依然要画图帮助思考。如下图:

标题

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫白小猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值