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

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

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

struct ListNode* reverse(struct ListNode* headint k) {

    struct ListNode* cur, *next, *pre;

    pre = NULL, cur = head, next = head->next;

    while (k--) {

        cur->next = pre;

        pre = cur;

        cur = next;

        next = next->next;

    }

    return pre;

}

struct ListNode* reverseKGroup(struct ListNode* headint k ) {

    // write code here

    struct ListNode* dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode));

    dummyHead->next = head;

    struct ListNode* revHead, *revEnd;

    int count = 0;

    revHead = dummyHead, revEnd = dummyHead->next;  //head表示反转区间前一个节点,end表示反转区间后一个节点

    if (k == 1)                 //如果k=1,则直接返回

        return dummyHead->next;

    while (revEnd) {            //寻找区间节点过程中,如果区间后的节点不存在,则直接退出

        revEnd = revEnd->next;  //存在则指向下一个

        if (++count == k) {     //如果找到一个满足k的区间,则开始反转

            revHead->next = reverse(revHead->next, k); //区间前一个节点的next  为  反转后链表

            while (count--) {   //找到反转后的链表的 区间的末尾节点

                revHead = revHead->next;

            }

            revHead->next = revEnd; //此时head为反转好的区间的末尾节点,next指向之前保存的反转区间的后一个节点,

            //同时revHead处于下一区间的前一个节点。[2 1(head)] [3 4]

            count = 0;            //count置0

        }

    }

    return dummyHead->next;

}

全部评论

相关推荐

牛客78682892...:直接点还好,总比要了简历也不回的强
点赞 评论 收藏
分享
专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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