以LeetCode第117题为例,在这个过程中遇到问题
struct Node* connect(struct Node* root) {
if(root == NULL) return root;
struct Node* cur = root;
while(cur != NULL) {
//遍历当前层的时候,为了方便操作在下一层前面添加一个哑结点
//(注意)这里是访问当前层的结点, 然后把下一层串起来
struct Node *dummy = (struct Node*)malloc(sizeof(struct Node));//dummy是个头结点
//dummy->right = dummy->left=dummy->next = NULL;//最初没写这一段
struct Node* pre = dummy;//pre表示访问下一层结点的前一个结点,在循环中执行一次pre->next = cur ->?就会记录下一层的起始节点
//然后开始遍历当前层的链表
while(cur != NULL) {
if(cur->left ){
//当前左子节点不为空,就让pre的指向它
pre->next = cur->left;
pre = pre->next;//更新pre
}
if(cur->right){
pre->next = cur->right;
pre = pre->next;
}
cur =cur -> next;//继续访问这一行的下一个节点
}
//把下一层串联成一个链表后,让他赋值给cur
//后序继续循环直到cur为空
cur = dummy->next;
}
return root;
}
当运用的时候就报错了,报错一直提示在pre = pre -> next;。
观察同样思路的C++代码,在struct Node *dummy = (struct Node*)malloc(sizeof(struct Node));处使用的new Node(0);,搜索过后发现只是一个简单的初始化。
在经过查询之后了解到,原因
原因:
我们在访问某个变量时,因为这个变量中含有未赋值的指针。定义但是不赋值的指针叫做野指针。野指针指向不明,对程序有不可知的后果,引用了更是出大问题,所以,c语言严格反对野指针。
错误位置:
struct Node *dummy = (struct Node*)malloc(sizeof(struct Node));//dummy是个头结点
修改:将他应有的指针域全部赋值即可
struct Node *dummy = (struct Node*)malloc(sizeof(struct Node));//dummy是个头结点
dummy->right = dummy->left=dummy->next = NULL;//最初没写这一段