今天QQ群里有人咨询一个问题 例如单链表中头节点作用 然后联想到做项目中解决core一个问题 虽然每天都在吃饭睡觉打豆豆,啥框架业务都不懂 解决了这一个问题 正好和提问关联起来 必须记录下来
struct ListNode* root
先看一c语言代码
1.void initData(char* p)2. {3. p=new char[12];4. }5.6. char *p =NUll7. initData(p);8. if(p)9. {10. cout<<"变量初始化完成"11. }
因为在调用过程中编译器发生了一次copy 这个大家都懂 我分析一下不让自己忘记记录下来
initData(p) 经历如下变化 p=NUll; ptemp=p ptemp=ox000 //最后结果是 p=NUll ptemp local释放了 指针本身是不会发生任何变化
这个是做java根本意想不到的事情 在项目中为了解决这个问题 自然用到二级指针,
我也不赞成 关键是掌控不了他
对比一下
一个单链表 如果没有头节点
例如函数
void
reverseHalfListAgin(struct ListNode* root)
eg:2.init:3.root--A-B-C root 4.第一个节点 root >A5.如果对root 进行翻转6.{7. root=C->B->A;8.}9.root->A 结果failed10.11.如果对root删除:12.13.{14. root->B->c;15.}16.root->A 结果failed
没有头节点 对链表操对第一个节点的 操作(初始化等)等最容易出现问题
上面回答了用二级指针 跳出思维误区–
对于不可能事情就不去解决好了
为什么对root本身进行修改 对root->next (内容 *p)进行修改
带头结点的单链表不需改变头指针的值, 函数参数表中 只要对头结点使用指针变量即可 struct ListNode* pBegin=root->next 对pBegin一切操作就不会出现问题了
实际工作:
现在reids mdb等都使用了链表基本结构 我想删除一个记录 假如记录正好是第一个元素 还没开始写代码 就跳入陷阱去了 是不是出了冷汗!!
如果你还遇到那些陷阱 请关注留言 让大家开心一下