連結リスト OJ (2) 連結リストの最後の N ノードを削除する

 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;
    }
};

おすすめ

転載: blog.csdn.net/weixin_66151870/article/details/129095176