1 <? 2 //节点 3 class Node 4 { 5 private $Data;//节点数据 6 7 private $Next;//下一节点 8 9 public function setData($value) 10 { 11 $this->Data=$value; 12 } 13 14 public function setNext($value) 15 { 16 $this->Next = $value; 17 } 18 19 public function getData() 20 { 21 return $this->Data; 22 } 23 24 public function getNext() 25 { 26 return $this->Next; 27 } 28 29 public function __construct($data, $next) 30 { 31 $this->setData($data); 32 $this->setNext($next); 33 } 34 35 } 36 37 //链表数据 38 class LinkList 39 { 40 private $header;//头节点 41 42 private $size;//长度 43 44 public function getSize() 45 { 46 $i = 0; 47 $node = $this->header; 48 while ($node->getNext() != null) { 49 $i++; 50 $node = $node->getNext(); 51 } 52 53 return $i; 54 } 55 56 public function setHeader($value) 57 { 58 $this->header = $value; 59 } 60 61 public function getHeader() 62 { 63 return $this->header; 64 } 65 66 public function __construct() 67 { 68 header("content-type:text/html; charset=utf-8"); 69 $this->setHeader(new Node(null,null)); 70 } 71 72 /** 73 *@author Marx 74 *@param $data--要添加节点的数据 75 * 76 */ 77 public function add($data) 78 { 79 $node = $this->header; 80 81 //var_dump($this->header); 82 83 while($node->getNext() != null) { 84 $node = $node->getNext(); 85 } 86 87 $node->setNext(new Node($data,null)); 88 } 89 90 /** 91 *@author Marx 92 *@param $data--要移除节点的数据 93 * 94 */ 95 public function removeAt($data) 96 { 97 $node = $this->header; 98 99 if ($node->getNext() == null) { 100 return; 101 } 102 103 while ($node->getData() != $data) 104 { 105 $node = $node->getNext(); 106 } 107 108 $node->setData($node->getNext()->getData()); 109 110 111 $node->setNext($node->getNext()->getNext()); 112 } 113 114 /** 115 *@author Marx 116 *@param 遍历 117 * 118 */ 119 public function get() 120 { 121 $node = $this->header; 122 if ($node->getNext() == null) { 123 print("数据集为空!"); 124 return; 125 } 126 127 while ($node->getNext() != null) { 128 print('['.$node->getNext()->getData().'] -> \m'); 129 if ($node->getNext()->getNext() == null){break;} 130 $node = $node->getNext(); 131 } 132 } 133 134 /** 135 *@author Marx 136 *@param $data--要访问的节点的数据 137 * @param 此方法只是演示不具有实际意义 138 * 139 */ 140 141 public function getAt($data) 142 { 143 $node = $this->header->getNext(); 144 145 if ($node->getNext() == null) { 146 print("数据集为空!\n"); 147 return; 148 } 149 150 while ($node->getData() != $data) { 151 if ($node->getNext() == null) {break;} 152 153 $node = $node->getNext(); 154 } 155 156 return $node->getData(); 157 } 158 159 /** 160 *@author Marx 161 *@param $value--需要更新的节点的原数据 --$initial---更新后的数据 162 * 163 */ 164 public function update($initial,$value) 165 { 166 $node = $this->header->getNext(); 167 168 if($node->getNext() == null) { 169 print("数据集为空!\n"); 170 171 return; 172 } 173 174 while ($node->getData() != $initial) { 175 //var_dump($node->getData()); 176 //var_dump($initial); 177 echo "\n"; 178 179 if ($node->getNext() == null) {break;} 180 181 $node = $node->getNext(); 182 } 183 //var_dump($node->getData()); 184 //var_dump($value); 185 186 $node->setData($value); 187 188 } 189 } 190 191 //迭代反转 192 function ReverseList1(Node $pHeader) 193 { 194 $q = $pHeader->getNext();//首节点没值 只能获取下一个节点 称为【当前节点】 195 196 $p = null;//负责设置【当前】的下一个 next值 197 198 while($q)//【当前】 199 { 200 $r = $q->getNext();//负责拿下一个 201 202 $q->setNext($p);//负责设置【当前】 203 204 $p = $q;//将【更改后的当前】的存下来 205 206 $q = $r;//将一下节点赋给【当前】节点 207 } 208 209 $newNode = new Node(null, $p); 210 211 return $newNode; 212 } 213 214 $lists = new LinkList();//创建链表数据 215 216 $lists->add(1);//增加节点数据 顺序按push来 217 218 $lists->add(2); 219 220 $lists->add(3); 221 222 $haedNode = $lists->getHeader();//获取全量节点 223 224 var_dump($haedNode);//当前节点数据 225 226 $haedNode2 = ReverseList1($haedNode); 227 var_dump($haedNode2);//反转节点数据
反转链表流程图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现