その日の1つの質問をLeetcode:143.reorder-list(再注文リスト)

ここに写真の説明を挿入
アイデア:個人が使用する方法は比較的一般的です。スタックと参照の特性を使用して、スタックと参照を1つずつ戻し、接続します。もう1つの簡単なアイデアは、速度ポインターを使用して中間点を見つけ、元のリンクリストを2つに分割することです。リンクリスト、次にバックリンクリストの順序を逆にして、バックリンクリストをフロントリンクリストに挿入します。
ここに写真の説明を挿入

void fun(ListNode *&head1, ListNode *head2, int &size, int now, bool &flag)
{
    
    
    if (head2 == nullptr) //到达链表尾节点
    {
    
    
        return;
    }

    size += 1;//size用于统计链表元素个数
    fun(head1, head2->next, size, now + 1, flag);
    if (flag) //链表重排已完成,只需要一直return回去即可
    {
    
    
        return;
    }

    if ((now - 1 == size / 2 && !(size & 1)) || head1 == head2)//如果排到了重点
    {
    
    
        head2->next = nullptr;
        flag = true;
    }
    else 
    {
    
    
        ListNode *temp = head1->next;
        head1->next = head2;
        head2->next = temp;
        head1 = temp;
    }
}

void reorderList(ListNode *head)
{
    
    
    //栈+引用递归下去
    ListNode *head1 = head, *head2 = head;
    int size = 0;
    bool flag = false;
    fun(head1, head2, size, 1, flag);
}

おすすめ

転載: blog.csdn.net/wyll19980812/article/details/109187096