我正在编写一个名为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

最佳答案

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

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


为简单起见,请使用2种情况处理push_front():列表为空时以及列表具有节点时。


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


看起来像这样:

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几乎相同,只是更新tai​​l而不是head并使新的tail指向旧的方法,我相信您可以弄清楚。

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

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


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

09-10 00:04
查看更多