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

 

 

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
 
class Solution {
public:
    /**
     *
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    ListNode* reverseKGroup(ListNode* head, int k)
    {
        if(head == nullptr) //判空操作
        {
            return head;
        }

        ListNode * dummy = new ListNode(0);  //创建一个节点连接head
        dummy->next = head;

        ListNode * phead_con = dummy;   //此指针连接反转后链表的第一个节点
        ListNode * ptail_con = dummy;   //反转后链表的最后一个节点连接此指针指向的节点
         
        ListNode * start =  head;       //用于一段链表反转的指针  开始反转的位置
        ListNode * end   = head;        //结束反转的位置
         
        int count = 1;
         
        while(end) //如果 end 不为 nullptr 那么将会一直进行反转的操作
        {
            if(count >= k)  //当计数大于等于k时,也就是说end指针已经指过了k个节点,需要进行反转了
            {
                count = 1;
                ptail_con = end->next; //ptail_con 先指向后面没有被反转的节点
                 
                ListNode * pre = nullptr;   //下面时对一段链表进行反转
                ListNode * cur = start;     //start就是指向反转链表开始的节点
                ListNode * nxt = nullptr;
                while(cur != ptail_con)     //当cur指向不需要反转的节点ptail_con时就停止反转
                {
                    nxt = cur->next;
                    cur->next = pre;
                    pre = cur;
                    cur = nxt;
                }
            
                //反转后链表需要再接入到原来的链表中 
                //需要注意的是,一段反转完后,start指向的节点是尾,end指向的节点是头
                phead_con->next = end;      
                start->next = ptail_con;

                //此时是重新整理状态,
                phead_con = start;     
                ptail_con = start;

                //控制反转的start 和 end 都指向下一组要反转的链表的第一个节点
                start = start->next;
                end = start;
                continue;
            }
            count++;
            end = end->next;  //end指针指向下一个
        }
        return dummy->next;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值