我正在编写一个名为Playlist
的类,该类对PlaylistNodes
执行不同的操作。我上网查看并尝试实现push_back
和push_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几乎相同,只是更新tail而不是head并使新的tail指向旧的方法,我相信您可以弄清楚。
您没有提供足够的信息,所以我将猜测您的PlaylistNode :: insertNext设置了下一个节点。在这种情况下,您要做的是设置指向作为参数提供的节点的下一个指针:
PlaylistNode *PlaylistNode::insert_next(PlaylistNode *p) {
this->next = p;
return this;
}
只要正确创建PlaylistNodes,这应该或多或少起作用(不要将同一个节点压入2次,最终将导致节点指向其自身旁边,如注释中所述)。