最近做了几家IT公司的算法编程题,总体感觉就是即使有思路,也不知道该怎么下手。最最最绝望的是网友们的讨论也基本上是围绕java和c展开的,虽然学过点c和java,但也是皮毛,作为一个phper,总觉着应该尊重自己的选择,在此希望各位博友们多分享一下自己平时在做算法编程题时的php样例。争取将php“发扬光大”!
查找单链表中倒数第k个节点
前提:在单链表中,节点指针域只有一个,指向下一个节点,因此由尾节点开始遍历寻找第k个节点明显是不可行的。
解决办法:定义两个指针变量$cur,$pre,同时指向头节点(单链表的灵魂呀),还需要定义一个临时计数变量$i=0;第一个指针$cur先开始移动,当前结点指针域不为空时,$i自加1,当$i大于k时,第二个节点开始移动。这样的话,当第一个指针移动到尾节点时,第二个指针指向的正好是倒数第k个节点的前一个节点。这样我们就可以根据当前结点的指针域找到倒数第k个节点了。
具体代码:
<?php
/**
* Created by PhpStorm.
* User: wangd
* Date: 2017/3/28
* Time: 15:18
*/
class SearchNode { //定义单链表的节点
public $data = '';
public $next = null;
function __construct($data)
{
$this->data = $data;
}
}
/*
* 添加节点
* @param Node $head,mixed $data
* @return null
* */
function addNode ($head,$data) {
$cur = $head;
while (!is_null($cur->next)) {
$cur = $cur->next;
}
$newNode = new SearchNode($data);
$cur->next = $newNode;
}
/*
* 统计单链表节点个数
* @param Node $head
* @return int $i
* */
function countNode ($head) {
$cur = $head;
$i = 0;
while (!is_null($cur->next)) {
++$i;
$cur = $cur->next;
}
return $i;
}
/*
* 查找单链表中倒数第k个元素
* @param int $k, Node $head
* @return mixed $data
* */
function searchNode ($k,$head) {
if ($k<=0||$k>countNode($head)) {
return false;
}
$pre = $head;
$cur = $head;
$i = 0;
while (!is_null($cur->next)) {
++$i;
$cur = $cur->next;
if ($i>$k) {
$pre = $pre->next;
}
}
$node = $pre->next;
return $node->data;
}
$head = new SearchNode(null);
addNode($head,'a');
addNode($head,'b');
addNode($head,'v');
addNode($head,'r');
addNode($head,'o');
echo searchNode(5,$head);
上面代码如果有不足的地方,希望博友们可以指出