最後から二番目の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;
}
}