删除单链接列表中的m个节点

时间:2014-01-25 21:17:01

标签: c++ linked-list

编写函数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;
    }
}

但它不起作用!有什么不对?

1 个答案:

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

我可能更喜欢最后一个,因为避免不必要的迭代。