如何使程序向后打印链表?我让 printForward 函数工作正常,但 printBackwards 函数似乎什么也没做。我认为我走在正确的轨道上,但我现在有点卡住了。我认为 while 循环没有运行,因为由于某种原因 temp 为 NULL。
任何帮助都会很棒。
谢谢
列表.h
#include <iostream>
using namespace std;
class LinkedList
{
private:
struct Node
{
int data;
Node * next;
Node * prev;
};
Node * head, *tail;
public:
LinkedList();
bool addAtBeginning(int val);
bool remove(int val);
void printForward() const;
void printBackward() const;
};
#endif
列表.cpp
#include "List.h"
LinkedList::LinkedList()
{
head = NULL;
tail = NULL;
}
bool LinkedList::addAtBeginning(int val)
{
Node* temp;
temp = new Node;
temp->data = val;
temp->next = head;
head = temp;
return false;
}
bool LinkedList::remove(int val)
{
return false;
}
void LinkedList::printForward() const
{
Node* temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
void LinkedList::printBackward() const
{
Node* temp = tail;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->prev;
}
cout << endl;
}
应用.cpp
#include "list.h"
int main()
{
LinkedList aList;
aList.addAtBeginning(3);
aList.addAtBeginning(10);
aList.addAtBeginning(1);
aList.addAtBeginning(7);
aList.addAtBeginning(9);
aList.addAtBeginning(12);
aList.printForward();
aList.printBackward();
system("pause");
return 0;
}
我觉得有点奇怪,你只有一个addAtBeginning
方法,而没有方法可以在最后添加,后者我认为是链表的正常使用。 话虽如此,我认为这里的直接问题是你永远不会将tail
分配给任何东西。 试试这个版本的addAtBeginning
:
bool LinkedList::addAtBeginning(int val)
{
Node* temp;
temp = new Node;
temp->data = val;
temp->next = head;
if (head != NULL)
{
head->prev = temp;
}
if (head == NULL)
{
tail = temp;
}
head = temp;
return false;
`}
这里的逻辑是,对于空列表的第一个添加,我们将头和尾分配给初始节点。 然后,在随后的添加中,我们将一个新元素添加到列表的头部,然后分配next
和prev
指针,以在两个方向上链接新节点。 这应该允许您从尾部开始向后迭代列表。
更新 addAtBeginning 函数:
bool LinkedList::addAtBeginning(int val)
{
Node* temp;
temp = new Node;
temp->data = val;
temp->prev = temp->next = NULL;
// If adding first node, then head is NULL.
// Then, set Head and Tail to this new added node
if(head == NULL){
// If this linked list is circular
temp->next = temp->prev = temp;
head = tail = temp;
}else{ // If we already have at least one node in the list
// If this linked list is circular
temp->prev = head->prev;
temp->next = head;
head->prev = temp;
head = temp;
}
return false;
}
但请记住,如果您将此函数与它使此列表循环的部分一起复制,您将获得无限循环。因此,要么更改打印功能,要么不要复制该部分。