オファーkは、リスト・ノードを削除する最後から二番目のノード、二値画像、O(1)時間を獲得します

最後から二番目のk個のノード

アイデア:

二つのポインタ、ステップk-1を移動するための第一のポインタと、2つのノード、テーブルウォーク、ノードkへの最後から二番目のノードへの第2の第一の端部ノードと歩き始めました。
特殊なケースの処理は、受信ヌルポインタと、kがリストのノードの数より小さいことに留意されたいです。
PS:ダブルポインタが一般的に使用される方法は、中間ノードは、ポインタの速度を見つけるために使用することができます。

コード:


        ListNode* FindNodek(ListNode* head, int k)
{
    ListNode* p = head;
    ListNode* q = NULL;
    if (head == NULL)
    {
        return NULL;
    }
    if (k == 0)
        return NULL;
    for (int i = 0; i < k - 1; i++)
    {   
        if (p->next != NULL)
            p = p->next;
        else
            return NULL;
    }
    q = head;
    while (p->next != NULL)
    {
        p = p->next;
        q = q->next;
    }
    return q;
}

バイナリイメージ

アイデア:

再帰的なアイデア、最初のトラバーサルノードではなく、リーフノードは、左と右のサブツリー(ノートではない値)を交換しました。

コード:

void MirrorTree(TreeNode* root)
{
    if ((root == NULL) || root->left == NULL && root->right == NULL)
        return;
    TreeNode* temp = new TreeNode;//交换的是节点,而不是值
    root->left = root->right;
    root->right = temp;
    MirrorTree(root->left);
    MirrorTree(root->right);
}

削除リストのノードにO(1)時間

アイデア:

O(1)時間が指定されたノードを除去し、ノードへの後のコピーノード、ノード削除後ろを与えられます。
コード:

void DeleteNode(ListNode* head, ListNode* p)
{
    if (!head || !p)
        return;
    if (p->next != nullptr)
    {
        ListNode* q = p->next;
        p->value = q->value;
        p->next = q->next;
        delete q;

    }
    else if (p = =head)
    {
        delete p;
        head->next = nullptr;

    }
    else
    {
        ListNode* q == head;
        while (q->next != p)
            q = q->next;
        q->next = nullptr;
        delete p;

    }

}

おすすめ

転載: www.cnblogs.com/void-lambda/p/12357211.html