链表的Push_front和push_back方法似乎删除了一个节点

时间:2019-07-08 18:32:33

标签: c++ pointers linked-list push-back

我正在编写一个名为Playlist的类,它对PlaylistNodes执行不同的操作。我上网查看并尝试实施push_backpush_front方法,但未成功。

PlaylistNode *PlaylistNode::insert_next(PlaylistNode *p) {
    PlaylistNode *tmp = nullptr;

    tmp = this->next;
    this->next = p;
    p->next = tmp;

    return p;
}

Playlist::Playlist() {
    head = new PlaylistNode;
    prevToCurr = head;
    tail = head;
    size = 0;
}

Playlist *Playlist::push_back(PlaylistNode *p) {
    PlaylistNode *tmp;

    tmp = tail;
    tmp->insert_next(p);
    tail = p;

    prevToCurr = tail;

    size++;
    return this;
}

Playlist *Playlist::push_front(PlaylistNode *p) {
    size++;

    PlaylistNode *tmp = head;
    head = p;
    head->insert_next(tmp);

    return this;
}

当我跑步时:

play.push_front(node1);
play.push_front(node2);
play.push_front(node2);

然后打印链接列表,我只有2个节点:

ID 44: song2
ID 33: song1

2 个答案:

答案 0 :(得分:1)

您的初始化方法(构造函数)没有执行应有的工作。构造此类型的列表时,头和尾都必须都指向null,因为列表为空。我不确定“ prevToCurr”的作用是什么,但是我不认为列表使用类似的东西,所以我会摆脱它:

Playlist::Playlist() {
    head = null;
    tail = null;
    size = 0;
}

为简单起见,请处理以下两种情况下的push_front():列表为空时以及列表中有节点时。

  1. 如果列表为空,则只需使头和尾指向新节点即可。
  2. 当列表不为空时,将前一个头指向新节点并更新列表头。

会是这样的:

Playlist *Playlist::push_front(PlaylistNode *p) {
    if (size == 0) {
        head = p;
        tail = p;
    }
    else {
        head->insertNext(p);
        head = p;
    }
    size++;
    return this;
}

您的push_back()方法的实现方式与push_front几乎相同,只是更新尾部而不是头部,并使新尾部指向旧尾部,我相信您可以弄清楚。

您没有提供足够的信息,所以我猜您的PlaylistNode :: insertNext设置了下一个节点。在这种情况下,您要做的是设置指向作为参数提供的节点的下一个指针:

PlaylistNode *PlaylistNode::insert_next(PlaylistNode *p) {
    this->next = p;
    return this;
}

只要正确创建PlaylistNodes,这应该或多或少地起作用(不要将同一个节点压入2次,最终将使节点指向其自身旁边,如注释中所述)。 / p>

答案 1 :(得分:0)

正如评论中指出的那样,如果没有所有代码,这很难弄清楚,因此我们必须进行推断。从可能导致这种情况的原因向后工作,我们假设传递给push_front的节点具有空的next指针。然后,您的insert_next函数将使用该新节点的null指针,并将插入节点的next指针错误地更新为null,而不管它以前是什么。