PHP翻转一个单向链表(图解)

最近在撸mysql发现底层很多涉及到数据结构和算法的知识点,看见有点撸不动了转过头来看算法。

链表是什么

链表与动态链表这个里面有用C完成的一部分介绍,知识刚好可以交叉。其实单这样看也是看不动的推荐我的docker环境,和打开PHP的xdebug

#完整代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php

/**
* 一个链表结构
* Class ListNode
*/
class ListNode {
public $val = 0;
public $next = null;

function __construct($val)
{
$this->val = $val;
}
}

/**
* 链表尾部追加
* @param $node
* @param $val
*/
function addList($header ,$val)
{
$scan = $header;

while(!is_null($scan->next)){
$scan = $scan->next;//遍历到尾部
}

$scan->next = new ListNode($val);

}

/**
* 打印这个链表
* @param $header
*/
function seeList($header)
{
$scan = $header;
while(!is_null($scan->next)){
echo $scan->val.PHP_EOL;
$scan = $scan->next;
}
echo $scan->val.PHP_EOL;
}

/**
* 反转
* @param $header
* @return string
*/
function rev($header)
{

$re = '';

while($header){
$temp = $header->next;
$header->next = $re;
$re = $header;
$header = $temp;

}

return $re;

}


$header = new ListNode(1);
addList($header ,2);
addList($header ,3);
addList($header ,4);
seeList(rev($header));

#图解

初始化链表结构

这是最开始生成的一个一级链表结构,val是当前值 next是对应的下个节点

链表的第一次循环

第一次循环后经历了如下变化

  • $temp = $header->next; 把除第一个以外的后续节点暂存 2->3->4

  • $header->next = $re; 把上一次的$re插入$header第二个节点 1->null

  • $re = $header; $re为最终的返回值,迭代这个结果 1->null

  • $header = $temp;$header原始内容发生变化,$temp暂存内容替代,也是为下次偏移准备 2->3->4

第二次循环

链表第二次循环

变化如下

  • $temp = $header->next; 把除第一个以外的后续节点暂存 3->4

  • $header->next = $re; 把上一次的$re(1->null)插入$header第二个节点2->1->null

  • $re = $header; $re为最终的返回值,迭代这个结果

  • 继续偏移

接下来如此反复

链表反转后续

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~