トピック:
指定されたリンクリスト内の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;//返回新子链的头结点
}