题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

感觉这道题需要考虑的情况很多,

因为情况太多,导致代码太乱了, 估计需要参考其他人的看看。

大致逻辑是这样的。

封装一个递归方法,逻辑如下:

根据k的值遍历k-1次,获取一段数组最后一个节点。之后从这一段头节点开始遍历,把指针next指向前一个节点。直到遍历完成结束。

到最后,再次递归调用本方法,去处理下一段数组。把头节点的next指向递归方法的返回值节点。

最后当前方法的返回值是这一段数组的尾节点

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        
        if(k == 1)
        {
            return head;
        }
        return recursion(head,k);
    }

    public ListNode recursion(ListNode head,int k)
    {
        if(head==null)
        {
            return null;
        }
        ListNode tail = head;
        //获取每一节的尾巴,如果长度不够则证明是最后一节
        for(int i=0;i<k-1;i++)
        {

            tail = tail.next;
            if(tail==null){
                return head;
            }
        }

        ListNode end = tail.next ;
        ListNode tmp ;
        ListNode tmp2 ;
        ListNode tmp3 ;

        tmp = head;
        tmp2 = head.next;
        tmp3 = tmp2.next;
        
        head.next = null;
        while(tmp2!=end)
        {
            
            tmp2.next = tmp;
            tmp=tmp2;
            tmp2 = tmp3;
            if(tmp3!=null)
            {
                tmp3 =tmp3.next;
            }
            
        }
        head.next = recursion(end,k);
        return tail;
    }





}

全部评论

相关推荐

06-20 14:27
中山大学 C++
rt,day3就开始接需求
星际探神:你就想 你是水货他们都没面出来 他们也水 管他呢
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务