user-0 提问: 指针错误疑问

回复:
user: user-1
content: 引用 5 楼 fengrongtiedi 的回复:我的 疑问是 为什么还要有加一句：head->next = listnode1; listnode1 = head->next;             listnode1 = (ListNode*)malloc(sizeof(ListNode));这两句不足以为head->next分配有效的内存空间吗 head->next并未初始化，指针内容未知，直接listnode1 = head->next肯定不行

user: user-0
content: 我的 疑问是 为什么还要有加一句：head->next = listnode1; listnode1 = head->next;             listnode1 = (ListNode*)malloc(sizeof(ListNode));这两句不足以为head->next分配有效的内存空间吗

user: user-2
content: 你说的是到函数调用的那一步就出现这个错误， listnode2 = s.deleteDuplicates(head); 如果是执行到这句出现问题的话，我觉得可能是你的solution类的写的有问题，碰到野指针啥的。 刚刚搜了下，https://bbs.csdn.net/topics/390804361有个关于solution类的讨论，不过这个solution类是用来删除相邻相同值节点的，应该跟你的不同，不过至少可以供你参考一下。  我把这个套进去，稍微加了几句代码，运行没有出错，以下测试代码供参考，head->val的值分别取0，1，就可以看到listnode2 = s.deleteDuplicates(head);的执行效果了 #include<cstdio> #include<cstdlib> using namespace std;  typedef struct Node{     int val;     Node *next; }ListNode;   class Solution { public:     ListNode *deleteDuplicates(ListNode *head) {         // Start typing your C/C++ solution below         // DO NOT write int main() function         if (head == NULL)             return head;          ListNode* cur = head;         ListNode* pre = head->next;         ListNode* del = NULL;         while(pre != NULL)         {             if (cur->val == pre->val)             {                 del = pre;                 pre = pre->next;    //  <span style="color: #FF0000;">这句是有作用的，就是把pre指向next节点</span>                 cur->next = pre;    //                 delete del;  // <span style="color: #FF0000;">如果合并之后，这一句就是delete pre;另外建议你释放内存的时候这么写之后再加一句del = NULL;这样可以防止野指针的出现。</span>             }             else             {                 cur = cur->next;                 pre = pre->next;             }         }         return head;     } };    int main() {     ListNode *head,*listnode1,*listnode2;     head = (ListNode*)malloc(sizeof(ListNode));     //    head = new ListNode;     //     listnode1 = (ListNode*)malloc(sizeof(ListNode));     listnode2 = (ListNode*)malloc(sizeof(ListNode));     head->val = 0;     head->next = NULL;     for(int i = 0;i<3;i++)     {         if(i == 0)         {             listnode1 = head->next;             listnode1 = (ListNode*)malloc(sizeof(ListNode));             head->next = listnode1;         }         listnode1->val = i;         listnode1->next = (ListNode*)malloc(sizeof(ListNode));         listnode1 = listnode1->next;      }     listnode1->next = NULL;       Solution s ;     listnode2 = s.deleteDuplicates(head);      listnode2 = head;     while(listnode2->next != NULL)     {         printf("%d\n",listnode2->val);         listnode2 = listnode2->next;     }      return 0; }

user: user-0
content: 能不能详细解释下，谢谢

user: user-3
content: 少一个head->next = listnode1; int main() {     ListNode *head,*listnode1,*listnode2;     head = (ListNode*)malloc(sizeof(ListNode));     //    head = new ListNode;     //     listnode1 = (ListNode*)malloc(sizeof(ListNode));     listnode2 = (ListNode*)malloc(sizeof(ListNode));     for(int i = 0;i<3;i++)     {         if(i == 0)         {             listnode1 = head->next;             listnode1 = (ListNode*)malloc(sizeof(ListNode));             head->next = listnode1;         }         listnode1->val = i;         listnode1->next = (ListNode*)malloc(sizeof(ListNode));         listnode1 = listnode1->next;      }     listnode1->next = NULL;      Solution s ;     listnode2 = s.deleteDuplicates(head);      return 0; }