19. リンクされたリストの最後の N ノードを削除します
リンク リストを操作する場合、一般的な手法は、リンク リストの先頭ノードを指す nextnext ポインターを持つダミー ノードを追加することです。このように、ヘッド ノードで特別な判断を行う必要はありません。
たとえば、この問題で、ノード yy を削除したい場合、ノード yy の先行ノード xx を知り、xx のポインターが yy の後続ノードを指している必要があります。ただし、ヘッド ノードには先行ノードがないため、ヘッド ノードを削除するときは特別な判断が必要です。しかし、ダミーノードを追加すると、ヘッドノードの先行ノードはダミーノードそのものになるため、この時点では一般的な状況だけを考慮する必要があります。
特に、一部の言語では、メモリを単独で管理する必要があるためです。したがって、実際のインタビューでは、「削除されたノードに対応するスペースを解放する必要があるかどうか」という質問に対して、インタビュアーと積極的にコミュニケーションを取り、合意に達する必要があります。以下のコードは、デフォルトではスペースを解放しません。
連結リストが与えられた場合、 n
連結リストの最後から 2 番目のノードを削除し、連結リストの先頭ノードを返します。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head==nullptr)return nullptr;
ListNode* newhead = new ListNode(0); // 新建一个头结点
ListNode *slow = newhead, *fast = head;// slow从新头出发,
newhead->next = head; // fast从head出发
while(n--) fast=fast->next; // fast走n步
while(fast)
{
fast = fast->next; // 然后一起走直到遇到nullptr
slow = slow->next;
}
slow->next = slow->next->next; // 进行删除
return newhead->next;
}
};