链接列表的push_front和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

您的初始化方法(构造函数(没有做应该做的事情。在构建此类型的列表时,头部和尾巴都必须指向空,因为列表为空。我不确定" prevtocurr"做什么,但我认为列表不使用类似的东西,所以我会摆脱它:

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

为了简单起见,用2个情况处理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>

如评论中所述,如果没有所有代码,就很难弄清楚,因此我们必须推断。从可能导致的原因向后工作,我们假设传递给push_front的节点具有零next指针。然后,您的insert_next函数将采用新节点的NULL指针,并且不正确地更新了插入的节点的next指针,无论以前是什么。

相关内容

  • 没有找到相关文章

最新更新