php链表删除元素,PHP之从反向删除单链表元素的问题谈起
在完成一个单链表的删除指定元素的题目中,我发现了一件神奇的事情,php对象赋值给另外一个变量后,可以如同引用传值一般继续利用新的变量来实现链表的链接。
后面经过查证后发现:
PHP7.0版本除了对象,资源之外,其余数据类型均已实现写时复制
尝试写了一个简单测试代码,如下所示:
$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 保证是有效的。
分析下来就是一个基础单链表操作的变种题目,如果是从头往后删除的话,就是我们常见的删除操作。所以唯一不同的就是顺序问题,于是先定义获取单链表长度的函数和删除指定位置元素的函数,然后再调用的时候把从后往前的位置数改为从头往后数的位置即可。
/**
* 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的算法题也真的是脑力的撸铁呢。
php链表删除元素,PHP之从反向删除单链表元素的问题谈起相关推荐
- 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】
文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...
- DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)
目录 1.题目 2.题解 3.代码实现 1.题目 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 作者: 冯向阳 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使 ...
- 单链表操作2-单链表A拆分成奇数和偶数值单链表B和C(个人学习笔记,仅供参考)
单链表A拆分成奇数和偶数值单链表B和C 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 在一个带头结点的单链表A中,头指针为a,设计算法SplitList ( ...
- 单链表的合并算法_图解算法:单链表两两反转 | 眼睛会了手就会系列
一. 序 链表作为一种基本的数据结构,本身理解起来,很简单.它通过指针或者叫引用,将一组零散的内存空间(结点),串联起来组成一个数据存储结构. 链表根据其指针的指向和丰富程度,可以分为单链表.双向链表 ...
- 递归函数反向显示单链表
题目 不带表头的单链表, 结点类型: typedef struct LNode{int data;struct LNode* next; }Node; ,使用递归函数反向显示以h为头指针的单链表的所有 ...
- 对于插入和删除数据越频繁的操作 ,单链表较顺序存储结构效率越有优势
单链表由好多个结点构成 其中头节点可有可无 可以用来存放链表长度. 头指针必须有 每一个指针指向 下一个结点的数据域 头指针指向头结点 头结点中还有一个指针变量 指针域是一个结点类型的指针 #incl ...
- Java案例:正向和反向遍历单链表
文章目录 一.梁山好汉数据 二.创建单链表节点类 三.创建单链表工具类 四.创建单链表测试类 一.梁山好汉数据 座次 星宿 诨名(绰号) 姓名 初登场回数 入山时回数 梁山泊职位 1 天魁星 呼保义 ...
- 单链表折半查找c语言,为什么有序的单链表不能进行折半查找
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:为什么有序的单链表不能进行折半查找 问题详情:急!!!!拜托高手解答 等级低 分数不高 请帮帮忙 谢谢了回答:这是由链表的特决定的. ...
- python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...
本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...
最新文章
- B-JUI(Best jQuery UI) 前端框架
- 上海python培训比较好的机构-上海Python培训机构推荐
- 赵英时遥感原理分析和应用课件_细数5种停车场防砸车技术原理分析与应用
- 前端学习(904):同步任务和异步任务执行区别
- 解决asterisk sip呼叫 488 no acceptable here
- 【CodeForces - 628C】Bear and String Distance(贪心,构造)
- 小程序成长之路(四)-- 深入腾讯云(环境搭建)
- 域间套接字socketpair
- FinTech领域的风险控制——风险篇
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日)
- 九宫格拼图小游戏代码html,js实现九宫格拼图小游戏.pdf
- Nebula Graph - 基于Docker 安装 及 Studio
- sql server(MsSql)字段命名,表命名,视图命名,SQL语句书写参考
- android 位移传感器 坐标,位移传感器
- HyperLynx(三十一)高速串行总线仿真(三)
- freenom又行了-免费顶级域名白嫖一年,赶紧看看如何申请
- 已经安装了 AccessDatabaseEngine.exe,还是报错
- -nan(ind) 重载运算符以及结构体排序
- dell raid 恢复出厂设置
- 记录下2015申请apple开发者企业账号过程