天天看點

LeetCode25.k個一組翻轉連結清單

題目來源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/description/

題目描述:

LeetCode25.k個一組翻轉連結清單

該題目是對反轉一個連結清單的更新版。

如何反轉一個連結清單我在之前的部落格已經寫了:https://blog.csdn.net/qq_39241239/article/details/82973024

算法描述:

1.判斷連結清單,若連結清單為空或k=1直接傳回head。

2.每k個結點周遊連結清單。相當于把一個大連結清單分成k個結點為連結清單的小連結清單。

3.讓每個連結清單都進行反轉,最後再把這些連結清單連接配接起來就可以了。

代碼如下:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* p = head;  
        ListNode* r; 
        //若連結清單為空或k=1直接傳回head
        if(!p || k == 1) 
            return p;  
        for(int i = 1; i < k; i ++){
            //若剩餘結點不夠k個則直接傳回head
            if(!p->next)    
                return head;
            p = p->next;
        }
        //p,r為分界線,p為前面需要倒置的連結清單的最後一個結點,r為進入遞歸的第一個節點(head)
        r = p->next;
        //截取連結清單
        p->next = NULL;
        //temp為倒置後的連結清單
        ListNode* temp = reverse(head);
        ListNode* newHead = temp;
        //找到連結清單最後
        while(temp->next){
            temp= temp->next;
        }
        //在連結清單最後遞歸拼接需要倒置的其他連結清單
        temp->next = reverseKGroup(r,k);
        return newHead;
    }
    //反轉連結清單方法
    ListNode* reverse(ListNode* head) {
        ListNode *p,*newHead=NULL;
       	while(head){
       		p=head;
       		head=head->next;
       		p->next=newHead;
       		newHead=p;
		}
        return newHead;
    }
};
           

Java代碼:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode prev = null;
        ListNode cur = head;
        ListNode next = null;
        ListNode check =head;
        int canProceed = 0;
        int count = 0;
        
        while(canProceed<k && check != null){
            check=check.next;
            canProceed++;
        }
        
        if(canProceed==k){
            while(count<k && cur != null){
                next = cur.next;
                cur.next=prev;
                prev=cur;
                cur=next;
                count++;
            }
            if(next!=null){
                head.next=reverseKGroup(next,k);
            }
            return prev;
        } else {
            return head;
        }
    }
}