【问题标题】:Update pointer to last node in linked list更新指向链表中最后一个节点的指针
【发布时间】:2015-10-28 04:28:16
【问题描述】:

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

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

【问题讨论】:

  • 一般情况下,您在创建列表时设置head-&gt;next = tail和tail-&gt;prev = head。
  • @JonnyHenly 我是在构造函数中还是在这个函数中这样做?
  • 而不是遍历整个列表来设置要插入的元素的最后一个指针检查索引。如果它在末尾,只需将最后一个指针指向新指针,否则保持最后一个指针不变。

标签: c++ doubly-linked-list


【解决方案1】:

你为什么不只保留“最后一个”指针而不从第一个重新找到它? 有两个条件:

  1. 新添加的节点在最后一个节点的前面,此时'last'仍然指向最后一个节点。
  2. 新添加的节点是新的最后一个节点,在这种情况下,'last' 将是新添加的节点。因此,您只需将“最后一个”移至下一个即可。

只需将最后几行更改为:

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

更新:

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

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

【讨论】:

  • 如果我这样做,那么我最初在哪里设置最后一个?
  • 在构造函数中初始化“last”,如代码中使用的变量“first”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多