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

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

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

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

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head)    return head;

        // 每一段链表的尾为向后走 K个结点,若不足 K则返回 head
        ListNode* tail = head;
        for(int i=0; i<k; i++) {
            if(!tail)    return head;
            tail = tail->next;
        }

        // 新的头即为第一次反转的返回值,尾即为原来节点的 head。
        ListNode* newHead = revers(head, tail);
        head->next = reverseKGroup(tail, k);   // 递归的调用reverseKgroup,新的头即为上一次的尾

        return newHead;
    }

    // 反转从节点 head到 tail的链表。返回值即原链表节点 tail的前一个节点。
    ListNode* revers(ListNode* head, ListNode* tail) {
        if(head==tail)    return head;

        ListNode* cur = head;
        ListNode* pre = nullptr;
        // 注意此处为 cur!=tail, 逻辑才正确。
        while(cur!=tail) {
            ListNode* next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }

        return pre;
    }
};
全部评论
请问一下,递归如何计算时间复杂度呢
点赞 回复 分享
发布于 2022-03-23 09:10

相关推荐

三题看不懂四题不明白二题无法AC&nbsp;T=int(input())&nbsp;for&nbsp;_&nbsp;in&nbsp;range(T):&nbsp;n=int(input())&nbsp;s=input().split()&nbsp;k,mx=1,1&nbsp;for&nbsp;i&nbsp;in&nbsp;range(len(s)-1):&nbsp;if&nbsp;len(s[i])&lt;len(s[i+1]):&nbsp;k+=1&nbsp;elif&nbsp;len(s[i])==len(s[i+1]):&nbsp;if&nbsp;s[i]&lt;=s[i+1]:&nbsp;k+=1&nbsp;...
恭喜臭臭猴子:第二题用栈就行。合法的括号直接出栈了,剩下的是不合法的,肯定都得一个一个走。出入栈的过程中得记下进栈的括号的下标。最后栈里剩下的括号如果相邻两个的下标不连续,说明它们中间有一个合法的括号序列被出栈,结果加一
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总 笔试
点赞 评论 收藏
分享
用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
醉蟀:你是我今年见过的最美牛客女孩
点赞 评论 收藏
分享
评论
4
2
分享

创作者周榜

更多
牛客网
牛客企业服务