首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

韩顺平_PHP软件工程师玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理

2012-12-25 
韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT

韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/

韩顺平_PHP软件工程师玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
singleLink.php


singleLink2.php


假设,做一个很极端的例子。
(1)先加1号人物,首先cur指向head节点,cur->next为空,直接把1号人物加在head节点后面;
(2)再加2号人物,首先cur指向head节点,cur->next此时指向1号人物节点,cur->next->no为1和$hero->no为2进行比较,发现1不大于2,所以cur就向下面走一步,此时cur指向了1号人物节点,然后再去判断cur->next->no是否大于2,因为此时cur->next为空了,没法走了,只能把2号人物加在1号人物节点的后面。
(3)再加6号人物,首先cur指向head节点,cur->next此时指向1号人物节点,cur->next->no为1和$hero->next为6进行比较,发现1不大于6,所以cur就向下面走一步,此时cur指向1号人物节点,然后再去判断cur->next->no为2和$hero->no为6进行比较,发现2不大于6,所以cur就向下面走一步,此时cur指向了2号人物节点,然后再去判断cur->next->no是否大于6,因为此时cur->next为空了,没法走了,只能把6号人物加在2号人物节点的后面。
(4)再加3号人物,首先cur指向head节点,cur->next此时指向1号人物节点,cur->next->no为1和$hero->next为3进行比较,发现1不大于3,所以cur就向下面走一步,此时cur指向1号人物节点,然后再去判断cur->next->no为2和$hero->no为3进行比较,发现2不大于3,所以cur就向下面走一步,此时cur指向了2号人物节点,然后再去判断cur->next->no为6和$hero->no为3进行比较,发现6大于3,找到位置了,通过一种操作想办法把3号人物加进去。
singleLink3.php


执行过程分析图

图片大,在新窗口中打开图片,观看完整图片

韩顺平_PHP软件工程师玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
如上图所示,当加入3号人物的时候,cur指向2号人物节点,cur->next指向地址0x1234,即是6号人物节点,此时3号人物的地址为0x345。执行$hero->next=$cur->next;即让3号人物的节点的next指向6号人物节点地址0x1234,图中的①虚蓝线所示;然后$cur->next=$hero;即把2号人物节点的next由指向地址0x1234改为指向3号人物节点地址0x345,图中的③虚蓝线所示,原来的②实线断开。
这样就把3号人物插在了2号人物的后面。
没有好办法,光看是学不会的,自己动手敲代码,自己画图分析,加深理解。

再加改进功能:
不让有相同排名的英雄加入链表。
韩顺平_PHP软件工程师玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
把singleLink3.php中的while循环代码修改如下:
singleLink4.php


现在有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号人物节点就是最后一个节点了就是末尾了。
韩顺平_PHP软件工程师玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
singleLink5.php


singleLink6.php


单向链表的缺点分析:不能自我删除,需要靠辅助节点。
而双向链表,则可以自我删除,同时在二叉树,广义表中都需要使用到一个节点执行两个或者多个节点的运用!


韩顺平_PHP程序员玩转算法公开课_学习笔记_源代码图解_PPT文档整理_目录


热点排行