[LeetCode]Reverse Nodes in k-Group, 解题报告

65 篇文章 1 订阅

前言

今天收到了阿里的电子入职offer,看岗位的要求是要熟悉linux内核,迅速入手了一本《Linux内核设计与实现》,入职前希望能翻完一遍,在亚马逊货到付款下周二才能送到,这两天还是按部就班的写写LeetCode代码


题目

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5


思路

题目比较容易理解,因为涉及到的指针操作较多,所以这里也记录一下。解题方法:
  1. 处理特殊的情况,例如指针为空,翻转数k为1
  2. 获取需要翻转的次数,次数 = 节点总数 / k
  3. 将翻转k个节点抽象成局部函数,供主函数调用即可

AC代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public static ListNode reverseKGroup(ListNode head, int k) {
        int count = 0;
        ListNode p = head;
        while (p != null) {
            count ++;
            p = p.next;
        }
        
        // special case
        if (count < k || k == 1) {
            return head;
        }
        
        // loop count
        int loopCount = count / k;
        
        // local variable
        ListNode safeNode = new ListNode(Integer.MAX_VALUE);
        safeNode.next = head;
        
        ListNode pre = safeNode;
        ListNode cur = head;
        
        for (int i = 0; i < loopCount; i ++) {
            ListNode tmp = reverseK(cur, k);
            pre.next = tmp;
            
            ListNode tmpPre = null;
            ListNode tmpCur = tmp;
            
            for (int j = 0; j < k; j ++) {
                tmpPre = tmpCur;
                tmpCur = tmpCur.next;
            }
            
            pre = tmpPre;
            cur = tmpCur;
        }
        
        return safeNode.next;
    }
    
    public static ListNode reverseK(ListNode head, int k) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode post = null;
        
        for (; k > 0 && cur != null; k --) {
            post = cur.next;
            
            cur.next = pre;
            pre = cur;
            cur = post;            
        }     
        head.next = cur;
        
        return pre;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值