LC25题关于链表,补充了指针数组以及循环大法

LeetCode题目提醒收纳

第25. K 个一组翻转链表
本题还是用到链表,考察的是链表指针的变换;
这一题的特点就是根据题型设置了结构指针数组用以存储,十分方便!
不再用担心计算次数;
题目
K 个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

答题:

/**
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseKGroup(struct ListNode* head, int k){
    struct ListNode* first=head;
    struct ListNode num={0};
    struct ListNode* haha=NULL;
    struct ListNode** lists;//指针数组
    lists=(struct ListNode**)calloc(k,sizeof(struct ListNode*));
    num.next=head;
    haha=#//这个还是比较新颖的。
    int cnt=0;
    while(1){
        while(cnt<k&&first!=NULL){
            lists[cnt]=first;
            cnt++;
            first=first->next;
        }
        if(cnt<k) break;//推出条件,我感觉不用加first!=NULL,再经历一次循环即可
        while(cnt>0){
            haha->next=lists[cnt-1];//注意这里的cnt-1,不要犯迷糊。
            haha=haha->next;
            cnt--;
        }
        haha->next=first;//这一点不是很懂,因为我认为再经历最后循环的时候,first指向了NULL而且break推出了循环。
        //太机智了。。first是上一个循环的first,这一个循环的first与我无关。这个大法好!!!!
    }
    // for(int i=0;i<cnt;i++){
    //     haha->next=lists[i-1];
    //     haha=haha->next;
   // }
    free(lists);
    return num.next;

这个题还好在没有新开辟一个链表逐个赋值,而是用原链表的内存进行明智的变换。强。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值