开始学习数据结构。今天写了代码,改了字体。我曾经使用控制台看起来不错。今天我发现了一个更喜欢的风格。SourceCodePro上的两张图还是蛮好看的!!!进入正题,说说链表的操作节点。首先,必须有一个节点类来存储数据。data=X;分配$this->data=$data;}}链表管理类(用于操作节点数据)操作类的代码太长,我们解析头部,分段插入(因为比较简单,所以先说这个)听名字,就知道是从header链表为空时插入一个节点,链表不为空时初始化当前节点,并将新节点作为头节点publicfunctioninsertHead(int$data):bool{///////////////////////////////////////////////////////////////////////////+---------++-------++--------+//||||||//|头节点|+>|节点|+>|节点|+>//|||||||||//||||||||//|下一步|||下一步|||下一步||//+------+----+|+----+---+|+----+---+|//||||||//+-----++-----++-----+/////////////////////////////////////////////////////////////+---------++--------++--------+//||||||//+--->|头节点|+>|节点|+>|节点|+>//||||||||||//||||||||||//||下一步|||下一步|||下一步||//|+------+----+|+----+---+|+----+---+|//|||||||//+--------+|+-----++-----++-----+//|||//|新节点||//|||//|||//|下一步||//+----+---+|//||//+-----+////1.实例化一个数据节点//2.使当前节点的下一个节点等于当前头节点Point//即使当前头节点为null,它//3.使当前节点成为头节点//完成头节点的插入$newNode=newNode($data);$newNode->next=$this->head;$this->head=$newNode;returntrue;}插入节点(index=0为头节点,一个一个往下走,位置超过则返回false)publicfunctioninsert(int$index=0,int$data):bool{//插入的head节点,当head不存在,或者index为0if(is_null($this->head)||$index===0){return$this->insertHead($data);}//正常节点插入,索引从0开始//跳过头节点,从1开始$currNode=$this->head;$开始索引=1;//遍历整个链表,如果当前结点为null,则代表末尾的下一个结点,退出循环for($currIndex=$startIndex;!is_null($currNode);++$currIndex){//////////////////////////////////////////////////////////////////////////////+--------++--------++---------------++--------+//||||||||//|节点|+>|当前节点|+>|下一个当前节点|+>|节点|+>//||||||||||||//||||||||||||//|下一步|||下一步|||下一步|||下一步||//+----+---+|+----+---+|+------+------+|+----+---+|//||||||||//+-----++-----++--------++-----+///////////////////////////////////////////////////////////////////////////+--------++--------++------------++-------+//||||||||//|节点|+>|当前节点|+>|下一个当前节点|+>|节点|+>//||||||||||||//||||||||||||//|下一步|||下一步|||下一步|||下一步||//+----+---+|+--------+|+------+------+|+----+---+|//||+--------+|||||//+-----+|||+--------++-----+//|新节点||//|||//|||//|下一步||//+----+---+|//||//+-----+///////////////////////////////////////////////////////////////////////////+--------++------++------------++--------+//||||||||//|节点|+>|当前节点|+>|下一个当前节点|+>|节点|+>//||||||||||||//||||||||||||//|下一步|||下一步|||下一步|||下一步||//+----+---+|+----+---+|+------+------+|+----+---+|//|||+--------+|||||//+-----+||||+--------++-----+//+---->|新节点||//|||//|||//|下一步||//+----+---+|//||//+-----+////1.当前索引等于传入参数的索引//2.实例化一个新的数据节点//3.新节点的下一个节点指向当前节点的下一个节点//4.当前节点的下一个节点指向新节点if($currIndex===$index){$newNode=newNode($data);$newNode->next=$currNode->next;$currNode->next=$newNode;返回真;}//移动到下一个节点$currNode=$currNode->next;}returnfalse;}以上两个是插入的基本操作。看一下示例的代码。insertHead(8);//58$manager->insertHead(5);//158$manager->insertHead(1);//1258$manager->insert(1,2);//小于6的假节点元素$manager->insert(5,4);//12589$manager->insertEnd(9);//3$manager->find(8);//1289$经理->删除(2);查找链表的值也很简单,只需要遍历/***在链表的值中查找索引*成功返回索引值,找到小于返回-1**@paramint$data*@返回int*/publicfunctionfind(int$data):int{$currNode=$this->head;//查找还是很简单的,遍历一次链表,然后判断值是否相等for($i=0;!is_null($currNode);++$i){if($currNode->data===$data){return$i;}$currNode=$currNode->next;}return-1;}只需要遍历一次链表,找到相等的值,找到返回索引值,如果没有找到返回-1delete/***删除链表的节点**@paramint$index*@returnbool*/publicfunctiondelete(int$index):bool{//没有节点,跳过if(is_null($this->head)){返回假;}elseif($index===0){//删除头节点$this->head=$this->head->next;}//这里的起始索引是1//但是当前节点指向的是实际的头节点//因为在删除的时候,必须标记上一个节点被删除//for的判断是判断下一个节点是不是null//$currNode是要操作的节点//$currNode->next是要删除的节点$startIndex=1;$currNode=$this->head;for($i=$startIndex;!is_null($currNode->next);++$i){if($index===$i){//使当前节点等于下一个要删除的节点//完成删除$currNode->next=$currNode->next->next;休息;}$currNode=$currNode->下一个;}returntrue;}End代码已经托管在github上,有时间继续学习数据结构,双链表,树之类的!!!
