从给定位置开始删除简单链接列表中的元素

时间:2013-10-17 23:18:59

标签: c++ algorithm linked-list

我已经用这种方式实现了这个功能:

typedef node* List;
void DeleteFromPos(List &l, unsigned int p) {
    List lAux = l;
    unsigned int count = 1;

    while (lAux) {      
        if (p == 1) {
            while (l) {
                List del = lAux;
                lAux = lAux->next;
                delete del;
                del = NULL;
            }
            lAux = NULL;
        } else if (count < p-1) {
                lAux = lAux->next;
                count++;
        } else {
            List del = lAux->next;
            if (del) {
                lAux->next = del->next;
                delete del;
                del = NULL;
            } else
                lAux = NULL;
        }
    }
}

问题是当p == 1时,在这种特殊情况下,所有元素都被删除但看起来l指针仍然存在于最后。 我需要一些关于此的建议。

编辑:有一些sugerence,p == 1的情况有他自己的循环,它的丑陋,但它的工作。

3 个答案:

答案 0 :(得分:1)

void DeleteFromPos(List &l, unsigned int p)

我相信您通过引用传递指向node的指针,这样如果要删除列表的头部,您可以更新指针本身,以便调用者可以看到此更改。但你这样做:

List lAux = l;

将这种潜力抛弃了。如果p等于1,您应该执行以下操作:

if (p == 1) {
    List del = l;
    l = l->next;   // <-- updates pointer that was passed by reference
    delete del;
}

答案 1 :(得分:1)

指针l在您的功能中未更改。您更改指针lAux但保持其原始值。

答案 2 :(得分:1)

通过模块化简化您的任务。首先有一个删除列表中所有元素的函数。

deleteList(List *&head) {
   while (head) {
      List *l = head->next;
      delete head;
      head = l;
   }
}

注意*&amp; - 引用指针。因此,该函数修改了head参数。

然后有一个定位第n个元素的函数。当你有第n个节点调用上面的函数时。

如果你真的需要在一个功能中完成这项工作,那就做一些事情:

deleteFromPosition(List *&head, unsigned int pos) {
  loop one: iterate through the list until n-th node is reached;
  loop two: iterate through the list tail deleting nodes as in the function above;
}

我正在为您的练习留下详细信息。