LeetCode(25)--Reverse Nodes in k-Group

转载自博客
题目要求对链表中的元素按K个一组,反序后,形成新的链表。对于最后不满K个元素,保持原来的顺序输出。所以本题可以按如下方法解:
1、建立空的新链表list1.
2、如果原链表剩余元素个数不小于K个,则取K个元素,采用头插法构建反序的临时链表,插入list1的尾部。
3、如果链表剩余元素个数小于K个,则将剩余的链表插入到list1的尾部。
实现代码如下:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (head == nullptr) return nullptr;
        int count = 0;
        ListNode* res=NULL;
        ListNode tmpHead(-1);
        ListNode *tail = &tmpHead;
        ListNode*p = head;
        //计算链表的长度
        while (head)
        {
            head = head->next;
            count++;
        }
        //待反序的链表数
        int m = count / k;
        if (m == 0)return p;
        while (m)
        {
            //每k个的头部pHead,再将pHead连接到上一k个
            ListNode *pHead = NULL;
            for (int i = 0; i < k; i++)
            {
                ListNode* tmpP = p;
                p = p->next;
                pHead = addHead(pHead, tmpP);
            }
            if (m ==count/k)res = pHead;
            //上一个的tail尾部连接到新的头部
            tail->next = pHead;
            //找到每k个反序后的最后一个tail
            while (tail->next)
            {
                tail = tail->next;
            }
            m--;
        }
        tail->next = p;
        return res;
    }
    ListNode* addHead(ListNode*head, ListNode* Node)
    {
        Node->next = head;
        return Node;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值