继续上节的内容:
我们现在再加入删除功能:
分析图
现在有3个人物节点,要把3号人物节点删除。
(1)首先有一个变量cur指向了head节点,即$cur=$head;$cur->next!=null成立,进入while循环,进行if判断,$cur->next->no为1,则和$herono为3不相等,cur向下走一步。
(2)此时cur指向了1号人物节点,$cur->next!=null成立,进入while循环,进行if判断,
$cur->next->no为3,则和$herono为3相等,找到位置了就break跳出了while循环。就要把这个3号人物节点拿掉,应该怎么拿呢?假设3号人物节点地址为0x123,7号人物节点地址为0x456,现在就是要把1号人物节点的next值改为0x456,这样3号人物节点就不在此单链表中了。
有人会有疑惑:3号人物节点不是也有next值,指向0x456吗即指向7号人物节点的,不用担心,此时3号人物节点已经是垃圾对象了,因为在php、java和c#中都有规定,如果一个对象没有任何一个引用指向它,它就是垃圾了,这一点一定要清楚,垃圾回收机制就会把3号人物节点回收了,这就是拿掉3号人物节点的思路。
删除代码:
$cur->next=$cur->next->next;
注意:当你刚好删除的末尾会不会有问题呢?
删除最后一个节点,即要删除7号人物,那么cur就定位到了3号人物节点,此时$cur->next->next就是 7号人物节点的next属性值,7号人物节点是最后一个节点,它的next属性值为null,那么$cur->next=$cur->next->next;就是把3号人物节点的next属性值置为null,那么此时3号人物节点就是最后一个节点了就是末尾了。
看效果:
继续添加修改功能:
很好理解
韩顺平的单链表笔记——增删查改功能都一一介绍完了。朋友们您可以用楠神提供的代码做改进,试着结合HTML表单,超全局变量$_POST等,把单链表的增删查改功能通过表单提交实现了,而不是直接在源代码里操作数据。
下节我们开始了解单链表的升级版——环形链表(循环链表),听名字再结合单链表我们大概也能猜到环形链表是什么样子的吧。
尾节点的next不指向null了,指向前面的节点(大多是指向第一个数据节点)。