LeetCode-25-Reverse Nodes in k-Group(C语言实现)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
    //当链表为空,返回空指针
    if(head == NULL)
        return NULL;
    //当链表只有一个元素,直接返回
    if(head -> next == NULL)
        return head;
    //声明参数
    int i, j;
    int num = 0;
    struct ListNode *t, *pr, *ne, *p, *q, *r, *s;
    t = head;
    pr = head;
    ne = head;
    p = NULL;
    q = NULL;
    r = NULL;
    s = NULL;
    //获取链表元素数目
    while(t != NULL)
    {
        ++num;
        t = t -> next;
    }
    //当k大于链表元素总数,不做处理,直接返回
    if(num < k)
        return head;
    //用t指向最终返回的链表头
    t = head;
    for(i = 1; i < k; ++i)
        t = t -> next;
    //进行num/k次循环转序处理
    for(j = 0; j < num / k; ++j)
    {
        //初始将s、p、q三个指针指向当前处理子链表的第一个节点
        s = pr;         //用于记录当前子链表转序处理完成后的最后一个节点
        q = pr;         //用做游标指针,标记当前处理节点
        p = pr;         //用作tmp指针,辅助完成节点排序
        //初始将pr、ne两个指针指向当前处理子链表的最后一个节点
        //用pr指针记录转序结束得到的新串的第一个节点
        for(i = 1; i < k; ++i)
        {
            if(pr -> next != NULL)
            {
                pr = pr -> next;
                ne = ne -> next;
            }
        }
        //用ne指针记录当前处理子链表的下一个元素或空指针
        ne = ne -> next;
        //转序处理(按顺序将子链表内第1到k-1个元素插入最后一个元素的后面)
        while(q != pr)
        {
            q = q-> next;
            p -> next = pr -> next;
            pr -> next = p;
            p = q;
        }
        //对转序结束得到的新串设置后继
        s -> next = ne;
        //对转序结束得到的新串设置前继
        if(r != NULL)
            r -> next = pr;
        //初始化下一次循环的初始条件(上一个子链表的尾节点、预处理子链表的首节点)
        r = s;
        pr = ne;
    }
    
    return t;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值