c++ - 链表插入,指针混淆
问题描述
我环顾了论坛,但似乎无法找到这个非常普遍的问题的答案。下面的类是一个基本的单链表,以标准方式编写 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。如果列表为空,则它不会进入循环,并且 head 将通过将 temp 设置为 curr (将其自身设置为 head)设置为新节点。
这个逻辑对我来说很有意义,所以它一定是我缺少的其他东西。
感谢您的帮助!
解决方案
您的函数将在第一次插入或回推时失败,即当头指针开始为空时。当您像这样将 head 分配给 curr 时:
curr = head;
curr 现在指向 head 而不是反之亦然。当 curr 然后被分配 temp 时(即当第一个节点被插入到这个链表中时),你只用 temp 保存的位置重新分配了指针 curr。现在你所拥有的只是一个指向与 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;
}
推荐阅读
- javascript - FormData append 是追加文件后的空对象
- java - 使用 slf4j (log4j.xml) 的日志文件为空
- group-by - Power BI 上的基本 groupby 表达式
- c - 根据 K&R,“将数字字符串转换为等效的数字”示例无法正常工作
- git - 结帐时出现 Git 错误:“致命:参考不是树”
- intellij-idea - 隐藏一些 Intellij 调试器和编辑器工具栏以减少屏幕混乱
- api - 查找 Instagram 中某些照片之类的所有用户名
- regex - RE2 语法的负前瞻工作
- javascript - 完成之前的任务后先调用tasked
- c# - 列表框未在 WPF 应用程序中排序