PHP之从反向删除单链表元素的问题谈起
PHP之从反向删除单链表元素的问题谈起
在完成一个单链表的删除指定元素的题目中,我发现了一件神奇的事情,php对象赋值给另外一个变量后,可以如同引用传值一般继续利用新的变量来实现链表的链接。
后面经过查证后发现:
PHP7.0版本除了对象,资源之外,其余数据类型均已实现写时复制
尝试写了一个简单测试代码,如下所示:
<?php
$obj1 = new stdClass();
$obj1->val = 3;
$obj1->next = null;
$obj2 = $obj1;
$obj2->next = array();
$obj2 = null;
var_dump($obj1);
打印出的$obj1的结构里面不会因为$obj2被赋值为null而让$obj1成为null。
关于从后往前面删除单链表元素的问题,原题如下:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
分析下来就是一个基础单链表操作的变种题目,如果是从头往后删除的话,就是我们常见的删除操作。所以唯一不同的就是顺序问题,于是先定义获取单链表长度的函数和删除指定位置元素的函数,然后再调用的时候把从后往前的位置数改为从头往后数的位置即可。
/**
- Definition for a singly-linked list.
- class ListNode {
- public $val = 0;
- public $next = null;
- function __construct($val) { $this->val = $val; }
- }
*/
class Solution {
/** * @param ListNode $head * @param Integer $n * @return ListNode */ function removeNthFromEnd($head, $n) { $length = getLength($head); $from_start_num = $length - $n; // if ($n == 1 && $length == 1) { // return null; // } // if ($from_start_num == 0 && $n === $length) { // return $head->next; // } $return_node_list = deleteLinkItem($head, $from_start_num); return $return_node_list; }
}
/**
- @param $head
- @param int $index
- @return null
*/
function deleteLinkItem($head, $index = 1) {
if (is_null($head)) { return null; } else { if ($index == 0) { return $head->next; } $i = 1; $current = $head; while($current->next != null) { if ($i == $index) { $tmp = $current->next; break; } $i++; $current = $current->next; } $current->next = $tmp->next;
return $head; }
}
/**
- @param $head
- @param $node
- @param int $index
- @return mixed
*/
function getLength($head) {
if (empty($head)) { return 0; } $i = 1; while($head->next != null) { $i++; $head = $head->next; } return $i;
}
唯一要注意的是,由于deleteLinkItem的$index是从1开始算的,和脚标起始0不同,假如是要删除0下标(也就链表是第一个元素被删除),那么直接返回头部节点的next即可,如代码中的这段:
if ($index == 0) {
return $head->next;
}
总的来说解法中规中矩,没有利用的PHP的黑魔法。越是自由度高的编程语言,对于算法题来说越难真正锻炼到,所以往往需要自废神功,当成静态语言去玩。而下标看得让人脑仁疼,看来即使是一道medium的算法题也真的是脑力的撸铁呢。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分享实录 | 阿里巴巴DevOps文化浅谈
【以下内容为分享实录,有删节】 DevOps发展的三个阶段 首先我们简单看一下什么是DevOps,这个词从何而来。我在这里把DevOps发展历史分为三个阶段:诞生期、定义期和落地期。 DevOps的“祖师爷”是比利时一名独立IT咨询师Patrick Debois。2007年,他负责一个大型项目的测试和验证工作,一边和开发对接测试代码,一边和运维对接“发版”。他发现项目组里的开发和运维两个角色的思维方式差异巨大,一边希望“快快快”,一边希望“稳稳稳”,这让他有点崩溃。 在2008 Agile Conference大会上,Patrick遇到了Andrew,两个人一拍即合,开始琢磨如何改变这种Dev和Ops水火不容的现状。 2009 年 10月,Patrick 通过 Twitter 召集开发工程师和运维工程师在比利时根特市举办了首届“DevOps
- 下一篇
「面试指南」解读JavaScript原始数据类型
「面试指南」解读JavaScript原始数据类型JavaScript 有 7 种原始数据类型:String(字符型)Number(数值型)Boolean(布尔值型)UndefinedNullObject(对象型)Symbol(符号型,ES6 中新增数据类型)通常使用 typeof 检测其类型(Null,Array,Object 除外),返回其数据类型值的字符串; String字符型:由一系列字符组成的字符串,属于值类型。 Number数值型:用来表示数值,属于值类型,可以用于算术逻辑计算。 Boolean布尔值型:用表示逻辑是,逻辑非:true,false,属于值类型。 Undefined未定义:定义未赋值,或未定义(直接使用会引起异常),特殊的数据类原始数据型。 Null空:代表一个空指针,特殊的一种原始数据类型。 Object对象型:以 key-value 的方式代表属性名与属性值,由{}组成,不同的属性以,隔开,JS 中一种重要的引用型原始数据类型。 Symbol符号型:ES6 新增的一种原始数据类型,主要用于解决属性名相同一起的冲突问题,每个 Symbol()值都不相同。 3 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路