我到处都是论坛,但似乎找不到这个非常普遍的问题的答案。下面的类是一个基本的单链接列表,其中pushBack以标准方式编写。
class linkedList {
private:
typedef struct node {
int data;
struct node *next;
node(int d):data(d), next(NULL){}
}*nodePtr;
nodePtr head, temp, curr;
public:
linkedList():head(NULL), temp(NULL), curr(NULL){}
void pushBack(int d) {
temp = new node(d);
curr = head;
if (curr != NULL) {
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = temp;
} else head = temp;
}
void printAll() {
curr = head;
cout << "list:" << endl;
while (curr) {
cout << curr->data << " ";
curr = curr->next;
}
cout << endl;
}
};
但是为什么不能这样编写我的pushBack函数?
void pushBack(int d) {
temp = new node(d);
curr = head;
while (curr != NULL) {
curr = curr->next;
}
curr = temp;
}
它应该遍历列表直到curr == NULL,然后设置curr = temp。如果列表为空,则它不会进入循环,并且通过将temp设置为curr(其自身设置为head)将head设置为新节点。
逻辑对我来说很有意义,所以它一定是我所缺少的。
谢谢您的帮助!
答案 0 :(得分:2)
您的函数将在第一次插入或推回操作时失败,即,当头指针开始为null时。当您将头分配给curr时:
curr = head;
curr指向head而不是相反,当为curr分配了temp时(即当第一个节点插入此链接列表时),您只重新分配了curr指针和temp所保持的位置。现在,您所拥有的只是一个指向与temp相同位置的指针curr,这两个指针根本都没有连接到头部指针!
您可以使用的代码的修改后的版本是:
void pushBack(int d)
{
temp = new node(d);
curr = head;
if(curr!=NULL)
{
while (curr != NULL)
{
curr = curr->next;
}
curr = temp;
}
else head=temp;
}