1.常见方法分为迭代和递归,迭代是从头到尾,递归是从尾到头
2.设置两个指针,old和new,每一项添加在new的后面,新链表头指针指向新的链表头
3.old->next不能直接指向new,而是应该设置一个临时指针tmp,指向old->next指向的地址空间,保存原链表数据,然后old->next指向new,new往前移动到old处new=old,最后old=tmp取回数据
while(old!=null){
  tmp=old->next
  old->next=new
  new=old
  old=tmp
}

  1. <?php
  2. class Node{
  3. public $data;
  4. public $next;
  5. }
  6. //头插法创建一个链表
  7. $linkList=new Node();
  8. $linkList->next=null;//头结点
  9. for($i=1;$i<=10;$i++){
  10. $node=new Node();
  11. $node->data="aaa{$i}";//创建新结点$node
  12. $node->next=$linkList->next;//$node->next指向头结点->next
  13. $linkList->next=$node;//头结点->next指向$node
  14. }
  15.  
  16. var_dump($linkList);
  17.  
  18. function ReverseList($pHead){
  19. $old=$pHead->next;//跳过头结点
  20. $new=null;
  21. $tmp=null;
  22. //反转过程
  23. while($old!=null){
  24. $tmp=$old->next;
  25. $old->next=$new;
  26. $new=$old;
  27. $old=$tmp;
  28. }
  29. //给新链表加个头结点
  30. $newHead=new Node();
  31. $newHead->next=$new;
  32. var_dump($newHead);
  33. }
  34. ReverseList($linkList);
  1. object(Node)#1 (2) {
  2. ["data"]=>
  3. NULL
  4. ["next"]=>
  5. object(Node)#11 (2) {
  6. ["data"]=>
  7. string(5) "aaa10"
  8. ["next"]=>
  9. object(Node)#10 (2) {
  10. ["data"]=>
  11. string(4) "aaa9"
  12. ["next"]=>
  13. object(Node)#9 (2) {
  14. ["data"]=>
  15. string(4) "aaa8"
  16. ["next"]=>
  17. object(Node)#8 (2) {
  18. ["data"]=>
  19. string(4) "aaa7"
  20. ["next"]=>
  21. object(Node)#7 (2) {
  22. ["data"]=>
  23. string(4) "aaa6"
  24. ["next"]=>
  25. object(Node)#6 (2) {
  26. ["data"]=>
  27. string(4) "aaa5"
  28. ["next"]=>
  29. object(Node)#5 (2) {
  30. ["data"]=>
  31. string(4) "aaa4"
  32. ["next"]=>
  33. object(Node)#4 (2) {
  34. ["data"]=>
  35. string(4) "aaa3"
  36. ["next"]=>
  37. object(Node)#3 (2) {
  38. ["data"]=>
  39. string(4) "aaa2"
  40. ["next"]=>
  41. object(Node)#2 (2) {
  42. ["data"]=>
  43. string(4) "aaa1"
  44. ["next"]=>
  45. NULL
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }
  56. }
  57. object(Node)#12 (2) {
  58. ["data"]=>
  59. NULL
  60. ["next"]=>
  61. object(Node)#2 (2) {
  62. ["data"]=>
  63. string(4) "aaa1"
  64. ["next"]=>
  65. object(Node)#3 (2) {
  66. ["data"]=>
  67. string(4) "aaa2"
  68. ["next"]=>
  69. object(Node)#4 (2) {
  70. ["data"]=>
  71. string(4) "aaa3"
  72. ["next"]=>
  73. object(Node)#5 (2) {
  74. ["data"]=>
  75. string(4) "aaa4"
  76. ["next"]=>
  77. object(Node)#6 (2) {
  78. ["data"]=>
  79. string(4) "aaa5"
  80. ["next"]=>
  81. object(Node)#7 (2) {
  82. ["data"]=>
  83. string(4) "aaa6"
  84. ["next"]=>
  85. object(Node)#8 (2) {
  86. ["data"]=>
  87. string(4) "aaa7"
  88. ["next"]=>
  89. object(Node)#9 (2) {
  90. ["data"]=>
  91. string(4) "aaa8"
  92. ["next"]=>
  93. object(Node)#10 (2) {
  94. ["data"]=>
  95. string(4) "aaa9"
  96. ["next"]=>
  97. object(Node)#11 (2) {
  98. ["data"]=>
  99. string(5) "aaa10"
  100. ["next"]=>
  101. NULL
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }
  108. }
  109. }
  110. }
  111. }
  112. }

[PHP] 数据结构-反转链表PHP实现的更多相关文章

  1. 数据结构与算法(c++)——反转链表

    算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐 ...

  2. 反转链表的golang实现

    问题:反转一个单链表. 输入: ->->->->->NULL 输出: ->->->->->NULL 首先先认识一下链表这个数据结构: 链表节 ...

  3. 数据结构-单链表-类定义2-C++

    上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...

  4. 数据结构之链表(LinkedList)(一)

    链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 1)链表是以节点方式存储的,是链式存储 2)每个节点包含data域(value),next域,指向下一个节点 3)各个节 ...

  5. 【剑指Offer面试编程题】题目1518:反转链表--九度OJ

    题目描述: 输入一个链表,反转链表后,输出链表的所有元素. (hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(0< ...

  6. 如何k个一组反转链表

    之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决. 本文要解决「K 个一组反转链表」,不 ...

  7. leetcode 练习--反转链表

    最近开始学习数据结构和算法的学习,也自然开始在 leetcode 上练习,所以每周大概会分享做过的leetcode 练习,尽量做到每天更新一道题目. 作为 leetcode 练习笔记的第一道题目,选择 ...

  8. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  9. 剑指Offer面试题:15.反转链表

    一.题目:反转链表 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 链表结点定义如下,这里使用的是C#描述: public class Node { public in ...

随机推荐

  1. $q的基本用法

    angularjs的http是异步的没有同步,一般都会遇到一个场景,会把异步请求的参数作为条件执行下一个函数,之前一直在看其他人的博客理论太多看了很久才看懂 http({ method:'post', ...

  2. Javascript高级编程学习笔记(9)—— 执行环境

    今天主要讲一下,JS底层的一些东西,这些东西不太好举例(应该是我水平不够) 望大家多多海涵,比心心 执行环境 执行环境(执行上下文,全文使用执行环境 )是JS中最为重要的一个概念,执行环境决定了,变量 ...

  3. 使用广播-BroadcastReceiver最详细解析

    女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和 ...

  4. koa-static与react-create-app搭配的路径

    概述 前端路由与后端路由的结合一直是一个难题.koa-static这个中间件能够把静态资源"搬到"后端路由上面去,react-create-app在不解构的情况下只会把资源打包到b ...

  5. Unicode 字符串排序规则(二):如何比较字符串

    一.UCA 简介 Unicode Collation Algorithm (UCA) 是 Unicode 规定的如何比较两个字符串大小的算法,也是事实上的标准.我们先来看下它的几个特征. 1.1 Mu ...

  6. LeetCode:110_Balanced Binary Tree | 平衡二叉树 | Easy

    要求:判断一棵树是否是平衡二叉树 Given a binary tree, determine if it is height-balanced. For . 代码如下: struct TreeNod ...

  7. xamarin.Android ImageView 图片圆角(自定义属性、扩展控件)

    新增 /values/Attrs.xml 文件 <?xml version="1.0" encoding="utf-8" ?> <resour ...

  8. (转)Linux开启路由转发功能

    原文:https://www.linuxidc.com/Linux/2016-12/138661.htm 标记一下,今天想让一台Red Hat Enterprise Linux 7开通iptables ...

  9. Spring Boot之JdbcTemplate多数据源配置与使用

    之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...

  10. 调试工具Chisel-LLDB插件

    Chisel-LLDB命令插件 相信每个人或多或少都在用LLDB来调试,比如po一个对象.LLDB的是非常强大的,且有内建的,完整的 Python 支持.今天我们主要介绍一个 facebook 开源的 ...