募集#18は、ノードのリストを削除するには、リストを削除します&& 18_2複製ノードを受賞

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_37549298/article/details/102779247

ノードリストを削除する:オーダーのリストを先頭ポインタとノードへのポインタに、機能は、ノードを削除する(1)時間O内で定義されています。

分析:トピックが直接ノードを削除することが与えられたので、あなたはO(1)時間内に指定されたノードを削除したい場合は、我々は次のノードがこのノードでカバーされるように削除することができますので、次のノードを削除することができますリスト全体が連鎖nullptrにのみ割り当て、その後、だけなのでノードであるときには、すべての上記2つの特殊なケースでは、ノードがリストの最後のノードであるが、リストはただ一つだけのノードでない場合は、続きがあり、この場合には、あなたは、このノードのノードを検索し、このノードを削除するには、事前に注文トラバーサルを使用する必要があります。

#include<iostream>
using namespace std;

//O(1)时间内删除节点
struct ListNode{
    int value;
    ListNode* next;
};
void DeleteNode(ListNode** pListNode,ListNode *pToBeDeleted){
    if(!pListNode || !pToBeDeleted)
        return ;
    //要删除的节点不是尾结点
    if(pToBeDeleted->next != nullptr){
        //那就用后一个节点覆盖前一个,然后删除后一个节点
        ListNode* pNext = pToBeDeleted -> next;
        pToBeDeleted->value = pNext->value;
        pToBeDeleted->next = pNext->next;
        delete pNext;
    }
    else if(*pListNode == pToBeDeleted) {
        //如果链表只有一个节点
        delete pToBeDeleted;
        pToBeDeleted = nullptr;
        pListNode = nullptr;
    }else{
        //如果有多个节点,然后删除的是最后一个,要用顺序搜索
        ListNode* p = *pListNode;
        while(p->next!=pToBeDeleted)
            p = p->next;
        p->next = nullptr;
        delete pToBeDeleted;
        pToBeDeleted = nullptr;
    }
}

複雑性分析:

* 時間計算:N-1個のノードのためのような非テールの平均時間複雑度を[(計算し、次いで、O(n)は、和を使用する、遠端ノードに対して、O(1)時間的に除去することが可能です- 1 N-)O(1)+(N)] / Nにして得られたO(1)。

重複したノードリストを削除し、ソートされたリンクリストのノードに複製し、ノードが繰り返しを保持しません、ヘッドポインタのリストを返します。重複したノード・リストを削除します。例えば、リスト4-> 5が処理され> 2-> 3-> 3-> 4-> 1- 1-> 2-> 5

分析:重複ノードを削除し、フラグは、リストをトラバース前もってその前駆体ノードを保存するために、Pと最初に定義することができる、次のノードを表すpNext Pは、それがpNext && pNext->ヴァル=利用することができる繰り返すかどうかを判断します= P-> valが、我々はサイクルを繰り返し、比較ノードの値が最後に特別な注意を事前するときに、削除等しい値であるかどうか、ある場合に直接真でなければならない、ポインタを移動させるために、TRUE、FALSEにフラグを設定しますnullptr直接ではなく、事前の>次= pまでならば、あなたは、PHEAD = Pを配置する必要があり、チェーンの先頭から削除されることを意味します。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode* pre = nullptr,*p = pHead,*pNext = nullptr,*ret = pHead;
        bool toDelete = false;
        while(p!=nullptr){
            toDelete = false;
            pNext = p->next;
            if(pNext && pNext->val == p->val){
                toDelete = true;
            }
            if(!toDelete){
                //如果不一样就直接移动指针
                pre = p;
                p = p->next;
            }else{
                //如果一样就得把所有重复的节点删除掉
                int value = p->val;
                while(p && p->val == value){
                    //凡是重复的节点都删除掉
                    //但是删除的时候要保存其后一个节点,否则会断链
                    pNext = p->next;
                    delete p;
                    p = pNext;
                }
                if(pre!=nullptr){
                    pre->next = p;
                }else{
                    ret = p;
                }
            }
        }
        return ret;
    }
};

おすすめ

転載: blog.csdn.net/weixin_37549298/article/details/102779247