[TOP202]题解 | #牛群的重新分组#

牛群的重新分组

https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* dummy = new ListNode(-1); // 创建一个虚拟头节点
        dummy->next = head; // 将虚拟头节点连接到原链表头部
        ListNode* prev = dummy; // prev 指针,用于定位当前要反转的一组节点的前一个节点
        
        while (head) {
            ListNode* start = head; // 当前要反转的一组节点的第一个节点
            ListNode* end = start; // 当前要反转的一组节点的最后一个节点
            
            // 移动 end 指针到当前要反转的一组节点的最后一个节点
            for (int i = 1; i < k && end; ++i) {
                end = end->next;
            }
            
            if (!end) {
                break; // 如果不足 k 个节点,则不进行反转
            }
            
            ListNode* next = end->next; // 当前要反转的一组节点的后一个节点
            
            // 反转从 start 到 end 的一组节点
            while (start != end) {
                ListNode* temp = start->next;
                start->next = end->next;
                end->next = start;
                start = temp;
            }
            
            // 将 prev 连接到反转后的一组节点的第一个节点
            prev->next = end;
            prev = head; // 更新 prev 指针,用于连接下一组反转的节点
            head = next; // 更新 head 指针,用于遍历下一组反转的节点
        }
        
        return dummy->next; // 返回新链表的头节点
    }
};


全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 18:25
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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