139-kセットの逆リンクリスト(再帰的)

トピック:
指定されたリンクリスト内のk個のノードのすべてのセットを反転し、反転したリンクリストに戻ります。リンクリスト
内のノードの数がkの倍数でない場合は、最後に残っているノードをそのままにします。
変更できませんノード内の値、ノード自体のみを変更できます。

例えば:

指定されたリンクリストは1-> 2-> 3-> 4-> 5です。

k = 2の場合、2→1→4→3→5を返す必要があります

k = 3の場合、3→2→1→4→5を返す必要があります

今回は再帰的な方法を使用してこの問題を解決します。問題を解決する
という私の考えは次のとおりです
。reverseKGroup(tail、k); //再帰的なスタック操作に
ここに画像の説明を挿入
特に注意してください

head-> next = reverseKGroup(tail、k);
現在のヘッド(反転されていないヘッドノード)は現在のテールを指し、現在のテールは反転された新しいサブチェーンのヘッドノードを指しますまたは、反転する必要のないkのサブチェーンのヘッドノードよりも小さい場合、現在の新しいサブチェーンが反転(再帰的にポップ)されます
コードは次のとおりです。

ListNode* reverseKGroup(ListNode *head, unsigned int k)
{
    
    
    if(head == NULL || head->next == NULL)
    {
    
    
        return head; 
    }
    ListNode *tail = head;
    for (int i = 0; i < k; ++i)
    {
    
    
        if(tail == NULL)
        {
    
    
            return head;//小于k,不改变
        }
        tail = tail->next;
    }
    
    ListNode *newHead = reverseList(head, tail);//获取新子链的头结点 
    
    head->next = reverseKGroup(tail,k);//递归入栈,当前head指向当前尾 
    
    return newHead;//递归全部出栈后,最后返回整条新链的头结点 
}

ListNode* reverseList(ListNode* head, ListNode* tail)//逆置子链 
{
    
    
    ListNode *p= NULL,*q= NULL;
    while(head!=tail)
    {
    
    
        p= head->next;
        head->next=q;
        q=head;
        head=p;
    }
    return q;//返回新子链的头结点 
}

おすすめ

転載: blog.csdn.net/LINZEYU666/article/details/112802763