编写函数bool DeleteMNodes (int x, int m)
的代码。
该函数删除值为m
的第一个x
节点。如果至少有一个节点的值为x
,则返回true;否则,它返回false。如果值为x
的节点数小于m
,则会删除值为x
的所有节点。该函数应在O(n)
。
以下是SSL节点的类:
class IntSLLNode
{
public:
int val;
IntSLLNode* next;
IntSLLNode(int val,IntSLLNode* next);
~IntSLLNode();
};
这是SSL类:
class IntSLList
{
public:
IntSLList();
~IntSLList();
bool IsEmpty(void);
void AddToHead(int val);
void AddToTail(int val);
void DeleteFromHead(void);
void DeleteFromTail(void);
bool DeleteNode(int val);
bool IsInList(int val);
bool DeleteMNodes (int x, int m); //My function
void Print();
private:
IntSLLNode *head, *tail;
};
以下是DeleteMNodes(int x, int m)
函数的实现:
bool IntSLList::DeleteMNodes(int x, int m)
{
IntSLLNode *pred, *tmp, *delNode;
int count=0;
if (IsEmpty())
return false;
if (count <= m) {
if (head->val == x) {
DeleteFromHead();
count++;
}
}
for (pred=head, tmp=head->next; tmp!=NULL;)
{
if (count <= m)
{
if (tmp->val == x)
{
delNode = tmp;
pred->next = tmp->next;
tmp = tmp->next;
delete delNode;
count++;
}
else {
pred = pred->next;
tmp = tmp->next;
}
}
}
if (count>=1)
return true;
else
return false;
}
}
但它不起作用!有什么不对?
答案 0 :(得分:1)
计数达到m后,它不会推进指针。例如,您有几个选项,如:
for (pred=head, tmp=head->next; tmp!=NULL;)
{
bool didDelete = false;
if (count <= m)
{
if (tmp->val == x)
{
delNode = tmp;
pred->next = tmp->next;
tmp = tmp->next;
delete delNode;
count++;
didDelete = true;
}
}
if(!didDelete)
{
pred = pred->next;
tmp = tmp->next;
}
}
或者你可以打破一次m == count。
for (pred=head, tmp=head->next; tmp!=NULL;)
{
if (count <= m)
{
if (tmp->val == x)
{
delNode = tmp;
pred->next = tmp->next;
tmp = tmp->next;
delete delNode;
count++;
}
else {
pred = pred->next;
tmp = tmp->next;
}
}
else {
break;
}
}
我可能更喜欢最后一个,因为避免不必要的迭代。