链表插入,指针混乱
linked list insertion, pointer confusion
我环顾了论坛,但似乎找不到这个非常笼统的问题的答案。下面的 class 是一个基本的单链表,带有标准方式的 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 将设置为新节点。
这个逻辑对我来说非常合理,所以它一定是我遗漏的其他东西。
感谢您的帮助!
您的函数在第一次插入或回推时会失败,即,当头指针开始时为空。当您像这样将 head 分配给 curr 时:
curr = head;
curr 现在指向 head 而不是相反。当 curr 被分配给 temp 时(即,当第一个节点被插入到这个链表中时),你只重新分配了指针 curr 和 temp 持有的位置。现在你只有一个指针 curr 指向与 temp 相同的位置,这两个指针根本没有连接到 head 指针!
您的代码的修改版本是:
void pushBack(int d)
{
temp = new node(d);
curr = head;
if(curr!=NULL)
{
while (curr != NULL)
{
curr = curr->next;
}
curr = temp;
}
else head=temp;
}
我环顾了论坛,但似乎找不到这个非常笼统的问题的答案。下面的 class 是一个基本的单链表,带有标准方式的 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 将设置为新节点。
这个逻辑对我来说非常合理,所以它一定是我遗漏的其他东西。
感谢您的帮助!
您的函数在第一次插入或回推时会失败,即,当头指针开始时为空。当您像这样将 head 分配给 curr 时:
curr = head;
curr 现在指向 head 而不是相反。当 curr 被分配给 temp 时(即,当第一个节点被插入到这个链表中时),你只重新分配了指针 curr 和 temp 持有的位置。现在你只有一个指针 curr 指向与 temp 相同的位置,这两个指针根本没有连接到 head 指针!
您的代码的修改版本是:
void pushBack(int d)
{
temp = new node(d);
curr = head;
if(curr!=NULL)
{
while (curr != NULL)
{
curr = curr->next;
}
curr = temp;
}
else head=temp;
}