K 个一组翻转链表

题目链接:K 个一组翻转链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* p ,*q,*pBeg,*pEnd;
        p = head;
        int cnt = 0;
        ListNode* pTail = NULL;
        int num = 0;
        for(p = head;p!=NULL;p=p->next){
            if(cnt == 0){
                //end的备选节点
                pEnd = p;
            }
            cnt++;
            if(cnt == k){
                
                if(num == 0){   //记录最终返回的头结点
                    head = p;
                }
                num++;
                //计数器归0
                cnt = 0;
                //begin的备选节点
                pBeg = p;
                q = p->next;
                //进行局部反转
                myReverseK(pEnd,q);
                if(pTail!=NULL){       //左连接
                    pTail->next = pBeg;
                }
                pEnd->next = q;         //右连接
                p = pEnd;               //恢复p,保证循环正常
                pTail = pEnd;
                //pTail->next == NULL;    人为断开了
            }

        }
        return head;
    }

    void myReverseK(ListNode* head,ListNode* stopPointer){
        ListNode* last,*p,*q;
        last = NULL;
        p = head;
        while(p!=stopPointer){
            q = p->next;
            p->next = last;
            last = p;
            p = q;
        }
    }
};
posted @ 2020-09-24 13:10  focusDing  阅读(115)  评论(0)    收藏  举报