更新指向链表中最后一个节点的指针

时间:2015-10-28 04:28:16

标签: c++ doubly-linked-list

我正在使用双向链表,我想使用指向列表中最后一个节点的指针,因此我可以从最后开始遍历。正如我在代码中看到的insert函数,我在最后通过整个链表来设置最后一个指针。有一个更好的方法吗?我觉得我可能会使用这种方法浪费资源。

void LinkedList::insert(ElementType dataVal, int index)
{
    if (index < 0 || index > mySize)
    {
        cerr << "Illegal location to insert -- " << index << endl;
        return;
    }

    Node * newPtr = new Node(dataVal);
    Node * predPtr = first;

    if (index == 0)
    {
        newPtr->next = first;
        first = newPtr;

        if(newPtr->next != NULL){
            predPtr->next->prev = newPtr;
        }
    } 
    else
    {
        for(int i = 1; i < index; i++)
            predPtr = predPtr->next;

        newPtr->prev = predPtr;
        newPtr->next = predPtr->next;
        if(newPtr->next != NULL){
            predPtr->next->prev = newPtr;
        } 
        predPtr->next = newPtr;
    } 
    mySize++;
    Node * lastPtr = first;

    while(lastPtr->next != NULL){
        lastPtr = lastPtr->next;
    }
    last = lastPtr;
}

1 个答案:

答案 0 :(得分:0)

为什么不保留'last'指针而不先将其重新绑定? 有两个条件:

  1. 新添加的节点位于最后一个节点的前面,在这种情况下,“last”仍然指向最后一个节点。
  2. 新添加的节点是新的最后一个节点,在这种情况下,“last”将是新添加的节点。所以你只需要将'last'移到下一个。
  3. 只需将最后几行更改为:

    while(last->next != NULL) {
        last = last->next;
    }
    

    更新

    考虑添加第一个节点的情况,您应该将最后几行更改为:

    if (last == NULL) {
        last = first;
    }
    if (last->next != NULL) {
        last = last->next;
    }