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

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

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

  • 首先,题目有两个特殊输入,即空 或者k=1 该情况只需直接返回即可
  • 下面考虑别的情况:

从第一个结点开始遍历

逆置的起点一定是从(n-1)k+1位 到 nk 如 123 k=3 逆置从1 到 3 n=1 

由于只有每次遇到k的倍数位时开始逆置,逆置个数为k个,而当出现不满k个的组就不会进行逆置

我们考虑创建一个空的头结点,每次遍历到倍数nk时开始逆置,但是同时需要记录逆置的开始指针,以及所需的指针 

例如: 12345 3 用q记录1 从1开始到3 用p记录3 r记录

q:用于记录每个开始逆置的结点

p:用于记录当前结点情况 为中间或逆置开始 或逆置结束结点

r:用于记录逆置结束位的下一位 ,方便下一次进行逆置

这里采用了i=1记录每个结点情况,是否为 首 中 尾

  • 若i%k==1,则令q=到当前位置; 此情况代表p遍历到了第(n-1)k+1
  • 若i%k==0,p为当前位置 ,r为当前位置的下一位,并开始逆置; 此情况代表p遍历到了nk
  • 其余情况, p往后移动 

 逆置:

tempHead=p;  注意:逆置结束后 p为新的头结点

(当q不为r时){//头插法

            temp=q->next;

            q->next=pre->next;

            pre->next=q;

            q=temp;

     }

     p=r;(回到i%k为1的情况 q=p;)

     pre=tempHead;

    当p为空时,要么结点全都接完了,要么位数不够,把剩余结点接入L即可

 位数不够时 (n-1)k+2 <= i <= nk 

    如果(i-1)%k!=0 这里取i-1去取余 

     pre->next = q; 接入头结点

struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
    // write code here
    
    //特殊情况
    if(k <= 1 || head == NULL){
        return head;
    }
    
    int i = 1;
    //创建一个头结点,便于反转
    struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
    L->next = NULL;
    struct ListNode *p,*pre,*q,*r,*tempHead;
    struct ListNode *temp;
    pre = L; 
    p = head; 
    
    while(p){ 
       
        if(i % k == 1){
            q = p;
        }
        
        if(i % k == 0){
            //r指向 p 的下一个 temp 指向 q
            r = p->next;
            tempHead = q;
            //头插法
            while(q!=r){
                temp = q->next;
                q->next = pre->next;
                pre->next = q;
                q = temp;
            }
            p = r;
            pre = tempHead;
            
        }else{
            p = p->next;
        
        }
        i++;
    }
    
    if((i-1) % k != 0){
        pre->next = q;
    }

    return L->next;

全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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