php-查找单链表中倒数第k个节点

最近做了几家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);

上面代码如果有不足的地方,希望博友们可以指出 大笑


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值