【作业7】字节真题:变形的链表反转
对应课程链接:拿捏算法面试:K个为一组反转链表
这是之前面试字节遇到的一道算法题,大致描述如下:
给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的 尾部 开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)
例如:
链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。
作业要求:
1、给出运行通过的代码,自己测试数据。
1、为了统一格式,为下面定义了一个方法
ListNode reverseKGroup2(ListNode head, int k){
}
请打卡给出你的代码。
答案:自己先做,之后在看答案:记一道字节跳动面试:变形的链表反转
PS:如果你不知道怎么打卡,可以看这里:打卡细则
共以下 14 个回答
“`
//首先逆序然后使用链表反转
public ListNode reverseKGroup(ListNode head, int k) {
““java
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
/*
}
打卡
class Solution {
public ListNode reverseKGroup(ListNode head,k){
ListNode firstReverse = reverseHead(head);
ListNode duringReverse = reverseKGroup(firstReverse,k);
ListNode lastReverse = reverseHead(duringReverse);
return lastReverse;
}
public ListNode reverseKGroup2(ListNode head, int k) {
//先分组
ListNode temp = head;
for(int i = 1;i<k&&temp!=null;i++){
temp = temp.next;
}
if(tempnull){
return head;
}
ListNode newTemp = temp.next;
temp.next = null;
ListNode newhead reverseHead(head);
ListNode lasthead reverseKGroup2(newTemp,k);
head.next = lasthead;
return newhead;
}
public ListNode reverseHead(ListNode head){
if(headnull||head.nextnull){
return head;
}
ListNode last = reverseHead(head.next);
head.next.next = head;
head.next = null;
return last;
}
}
一
时间O(n)
打卡
占个坑,一开始只想到了先用求余的方法找到反转起始点,没想到答案的解法这么优雅,过段时间来补卡!刚看完答案记得太清楚了/
这道题难点在于:将从头结点开始变为尾结点开始,如果还按照从头节点开始的思路,那么我们事先不知道应该从头结点往后第几个节点开始,进行一组一组的反转。
除了两次反转链表,我还有一个想法,就是先完整遍历一次链表,获取其长度 length,用 length % k,不就知道应该应该从头结点往后第几个节点开始了🤪
时间 $O(n)$
空间 $O(1)$