我正在编写一个名为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
您的初始化方法(构造函数(没有做应该做的事情。在构建此类型的列表时,头部和尾巴都必须指向空,因为列表为空。我不确定" 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相同,更新尾巴而不是头部并将新的尾巴指向旧的尾部,我敢肯定您可以弄清楚。
您没有提供足够的信息,因此我会猜测您的playlistnode :: insertNext设置下一个节点。在这种情况下,您在这里所做的工作是将下一个指针设置为提供的节点作为参数:
PlaylistNode *PlaylistNode::insert_next(PlaylistNode *p) {
this->next = p;
return this;
}
只要您正确创建playlistnodes,就应该或多或少地工作(不要将相同的节点推2次,您最终将以一个指向自身旁边的节点,如评论中所述(。<<<<<<<<<</p>
如评论中所述,如果没有所有代码,就很难弄清楚,因此我们必须推断。从可能导致的原因向后工作,我们假设传递给push_front
的节点具有零next
指针。然后,您的insert_next
函数将采用新节点的NULL指针,并且不正确地更新了插入的节点的next
指针,无论以前是什么。