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

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

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

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
 /**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
//思路  先求出链表长度,然后/k来求得要逆置的次数,用头插法来达到逆置的效果
 //记得要对一次的操作要特殊处理,同时要有一个prev指针来起到链接的作用
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
    struct ListNode* prev = head;
    struct ListNode* cur = head;
    struct ListNode* curnext = head;
    struct ListNode* tmp = head;
    struct ListNode* newhead = NULL;//分别是逆置后的头和尾
    struct ListNode* newtail = NULL;
    int leng = 0;
    int ret = k;
    while (cur)//求链表长度
    {
        cur = cur->next;
        leng++;
    }
    if (leng < k)
    {
        return head;
    }
    int num = leng / k;
    cur = head;
    while (num--)//要逆置的次数
    {
        ret = k;
        
        cur = curnext;
        while (ret--)//为了方便逆置后的头结点与原链表的链接
        {
            curnext = curnext->next;
        }
        while (cur != curnext)
        {
            tmp = cur->next;
            if (newhead == NULL)//头插法第一次逆zhi要特殊处理
            {
                cur->next = curnext;
                newhead = cur;
                newtail = cur;
            }
            else {
                cur->next = newhead;
                newhead = cur;
            }
            cur = tmp;
        }

        if ((num + 1) == leng / k)//对第一次操作要特殊处理
        {
            head = newhead;
            prev = newtail;
        }
        else
        {
            prev->next = newhead;
            prev = newtail;

        }
        newhead = NULL;//记得重置newhead的值
    }
    return head;
}

全部评论

相关推荐

牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
10-28 15:45
门头沟学院 C++
西南山:海康威视之前不是大规模裁员吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务