免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
ノードリストを削除する:オーダーのリストを先頭ポインタとノードへのポインタに、機能は、ノードを削除する(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;
}
};