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

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

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

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */
/*
之前做过一次,强迫症的我想着能不能一次遍历(我这里的代码是两次遍历)就搞定,磕了好久没做出来。这里说下这里的思路吧。
首先要对翻转链表很熟悉,p、q、r三指针翻转链表。而每k个进行翻转,中间的就是一段链表(而不是一个单独的节点),所以应该使用两个指针标定中间一段链表的头和尾(相当于q指针一分为二了)。先创建一个冗余头节点,这样比较好操作。每次就是让pre指针(pre的后继就是subHead)后移,然后让subTail在pre后面后移k次,并检查subTail是不是null。标定subHead、rear(也就是subTail的后继)之后,pre、subHead、subTail、rear四个指针保持不变,然后从subHead顺序遍历并翻转子链表,翻转完了之后更改上述四个指针的指向就可以了。

*/
class ListNode {
    int val;
    ListNode next;
    public ListNode() {
        next = null;
    }
    public ListNode(int v) {
        val = v;
        next = null;
    }
}
public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        if(k == 1) return head;
        ListNode pre = new ListNode();
        pre.next = head;
        ListNode subTail = pre;
        head = pre;
        while(subTail != null) {
            for(int i = 0; i < k; i++) {
                subTail = subTail.next;
                if(subTail == null) break;
            }
            if(subTail != null) {
                ListNode subHead = pre.next, rear = subTail.next;
                ListNode p = subHead, q = subHead.next; //保持四个标定位置的指针不变
                while(q != rear) {
                    ListNode r = q.next;
                    q.next = p;
                    p = q;
                    q = r;
                }
                pre.next = subTail; //更改子链表的头尾节点的连接
                subHead.next = rear;
                pre = subHead;
                subTail = subHead;
            }
        }
        return head.next;
    }
}

#23届找工作求助阵地#
全部评论

相关推荐

06-27 15:15
长安大学 Java
哈哈哈,你是老六:这种就是培训机构骗钱的
点赞 评论 收藏
分享
仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
二月份来北京实习,虽然提前做了攻略,但是是人生第一次经历租房,全程自己搞定,所以难免还是踩坑了😅奉劝大家,租房不要只看自己的房间如何,还要看别人的房门口环境如何因为我就是那个倒霉蛋,我旁边房间额门口堆了一大堆杂物,都是另一个房间的人放在外面的,而且他门口放了几十双鞋子,冬天还好,现在是夏天,可太味了,怎么有这么多鞋啊啊啊啊,请看图片O(≧口≦)O一开始这屋里是一个人住,后来变成两个人住(他说他妈妈来北京看病暂时住,ok能体谅的)但是大概一个多月以后他妈妈回家了,无缝衔接了一位女朋友接着住,而且他的女朋友巨能买东西,我真的不得不吐槽,🥲我不管别人怎么花钱的,但是你买东西你起不来,你能不能换个时间约送上门,总是在周内或者周末的某一天早上七点多,没到起来的时间,快递员框框敲门了!!!!而且经常点外卖但是我们楼下有门禁,外卖员按响铃他俩不去解锁,一直等一直等,等到我们其他人受不了去帮解锁,吵得要死,他们像聋了一样!!!服啦!!!我的房租一个月不到1600,但是是阳隔,很不隔音,隔壁的大哥有时候会半夜吃薯片或者嗑瓜子(凌晨两三点的时候)好几次我都从梦里被嗑出来了🥲还好还剩两个月就实习结束可以回家了,呜呜想家,想我自己的窝😭
码农索隆:这也是我不喜欢合租的原因
我的租房踩坑经历
点赞 评论 收藏
分享
06-27 15:29
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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