25. K 한 조 뒤 집기 링크

체인 시계 하나 드릴 게 요. k 한 노드 한 조 가 뒤 집 히 면 뒤 집 힌 링크 로 돌아 가세 요.
k 정수 입 니 다. 그것 의 값 은 링크 의 길이 보다 작 거나 같 습 니 다.
노드 총수 가 아니라면 k 의 정수 배 입 니 다. 그러면 마지막 남 은 노드 를 원래 의 순서 로 유지 하 십시오.
 
예시:
이 링크 를 드 리 겠 습 니 다: 1 - > 2 - > 3 - > 4 - > 5
... 해 야 한다 k = 2 시, 돌아 와 야 합 니 다: 2 - > 1 - > 4 - > 3 - > 5
... 해 야 한다 k = 3 시, 돌아 와 야 합 니 다: 3 - > 2 - > 1 - > 4 - > 5
 
설명:
당신 의 알고리즘 은 상수 의 추가 공간 만 사용 할 수 있 습 니 다.너 는 단순히 노드 내부 의 값 을 바 꾸 는 것 이 아니 라 실제 적 으로 노드 교환 을 해 야 한다.
출처: 스냅 백 (LeetCode) 링크:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 저작권 은 인터넷 에 귀속 된다.상업 전 재 는 정부 에 연락 하여 권한 을 부여 해 주 십시오. 비 상업 전 재 는 출처 를 밝 혀 주 십시오.
문제 풀이: 순수 시 뮬 레이 션, 매번 k 개의 결점 을 취하 여 뒤 집 고 뒤 집 은 후에 다시 연결 하면 됩 니 다.
class Solution {
public:
    ListNode* work(ListNode* l, ListNode* r){  //   [l,r]     
        r->next=NULL;
        ListNode* rt=new ListNode(-1);
        ListNode* p=rt;
        rt->next=l; p=l;
        r=l->next;
        while(r){
            p->next=r->next;
            rt->next=r;
            r->next=l;
            l=r;
            r=p->next;
        }
        return rt->next;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head==NULL||head->next==NULL||k<=1) return head;
        ListNode* rt=new ListNode(-1);
        ListNode* p=rt;
        int num=0;                         //    
        ListNode* l=NULL; ListNode* r=head;
        while(r){
            num++;
            if(num%k==1) {l=r; r=r->next;} //           
            else if(num%k==0){             //           
                ListNode* e=r;
                r=r->next;
                p->next=work(l,e);
                while(p->next) p=p->next;
            }else r=r->next;
        }
        if(num%k!=0) p->next=l;            //   k 
        return rt->next;
    }
};

좋은 웹페이지 즐겨찾기