题解 | #链表中的节点每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* createnode(int val)//一个创建新的链表节点的函数
{
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(newnode!=NULL)
    {
        newnode->val = val;
        newnode->next = NULL;
        return newnode;
    }
    return NULL;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
    // write code here
    struct ListNode* newhead = createnode(-1);//首先创建一个没用的节点作为头节点
    struct ListNode* output = newhead;//对于该节点进行备份,因为后面需要进行->next操作
    while(1)
    {
        int loop_break = 0;
        if(head==NULL)//对应的是空链表以及剩余节点数量不足以反转导致的指针为NULL的情况(就是这种例子{1,2,3,4,5},7)
        {
            break;
        }
        struct ListNode* head_cp = head;//head作为头指针,head_cp作为尾指针,将包括在内的节点反转
        int enough = 1;
        for(int i=0;i<k-1;i++)//这个循环是围为了判断是否存在足够的节点被反转
        {
            if(head_cp!=NULL)
            {
                head_cp = head_cp->next;
                if(head_cp==NULL)//说明不够了
                {
                    enough=0;
                    break;
                }
            }
            else
            {
                return NULL;
            }
        }
        int str[k];//存储要被反转的节点的val
        for(int i=0;i<k;i++)//初始化,因为不反转的部分也要存在里面,如果数量不够,后面读取会导致段错误
        {
            str[i] = -1;
        }
        if(enough==1)//数量够反转
        {
            for(int i=k-1;i>=0;i--)//将节点的值倒序存在数组中
            {
                if(head!=NULL)
                {
                    str[i] = head->val;
                }
                else
                {
                    printf("...error\n");
                    return 0;
                }
                head=head->next;
            }
        }
        else
        {
            for(int i=0;i<k;i++)//将节点的值正序存储在数组中
            {
                if(head!=NULL)
                {
                    str[i] = head->val;
                }
                else
                {
                    break;
                }
                head=head->next;
            }
            loop_break = 1;//当进入else说明不够反转数量,即结束的意思
        }
        for(int i=0;i<k;i++)
        {
            if(str[i]>=0)//这就是为什么初始化为-1的原因
            {
                printf("%d ",str[i]);
                struct ListNode* newnode = createnode(str[i]);
                if(newnode!=NULL)
                {
                    newhead->next = newnode;
                    newhead = newhead->next;
                }
            }
        }
        if(loop_break==1)//
        {
            break;
        }
    }
    output = output->next;
    return output;
}

全部评论

相关推荐

03-19 17:49
运营
牛客327038019号:你把那贼低的gpa写上去干嘛
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务