在完成一个单链表的删除指定元素的题目中,我发现了一件神奇的事情,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之从反向删除单链表元素的问题谈起相关推荐

  1. 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】

    文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...

  2. DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)

    目录 1.题目 2.题解 3.代码实现 1.题目 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 作者: 冯向阳 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使 ...

  3. 单链表操作2-单链表A拆分成奇数和偶数值单链表B和C(个人学习笔记,仅供参考)

    单链表A拆分成奇数和偶数值单链表B和C 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 在一个带头结点的单链表A中,头指针为a,设计算法SplitList ( ...

  4. 单链表的合并算法_图解算法:单链表两两反转 | 眼睛会了手就会系列

    一. 序 链表作为一种基本的数据结构,本身理解起来,很简单.它通过指针或者叫引用,将一组零散的内存空间(结点),串联起来组成一个数据存储结构. 链表根据其指针的指向和丰富程度,可以分为单链表.双向链表 ...

  5. 递归函数反向显示单链表

    题目 不带表头的单链表, 结点类型: typedef struct LNode{int data;struct LNode* next; }Node; ,使用递归函数反向显示以h为头指针的单链表的所有 ...

  6. 对于插入和删除数据越频繁的操作 ,单链表较顺序存储结构效率越有优势

    单链表由好多个结点构成 其中头节点可有可无 可以用来存放链表长度. 头指针必须有 每一个指针指向 下一个结点的数据域 头指针指向头结点 头结点中还有一个指针变量 指针域是一个结点类型的指针 #incl ...

  7. Java案例:正向和反向遍历单链表

    文章目录 一.梁山好汉数据 二.创建单链表节点类 三.创建单链表工具类 四.创建单链表测试类 一.梁山好汉数据 座次 星宿 诨名(绰号) 姓名 初登场回数 入山时回数 梁山泊职位 1 天魁星 呼保义 ...

  8. 单链表折半查找c语言,为什么有序的单链表不能进行折半查找

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:为什么有序的单链表不能进行折半查找 问题详情:急!!!!拜托高手解答 等级低 分数不高 请帮帮忙 谢谢了回答:这是由链表的特决定的. ...

  9. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

最新文章

  1. B-JUI(Best jQuery UI) 前端框架
  2. 上海python培训比较好的机构-上海Python培训机构推荐
  3. 赵英时遥感原理分析和应用课件_细数5种停车场防砸车技术原理分析与应用
  4. 前端学习(904):同步任务和异步任务执行区别
  5. 解决asterisk sip呼叫 488 no acceptable here
  6. 【CodeForces - 628C】Bear and String Distance(贪心,构造)
  7. 小程序成长之路(四)-- 深入腾讯云(环境搭建)
  8. 域间套接字socketpair
  9. FinTech领域的风险控制——风险篇
  10. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日)
  11. 九宫格拼图小游戏代码html,js实现九宫格拼图小游戏.pdf
  12. Nebula Graph - 基于Docker 安装 及 Studio
  13. sql server(MsSql)字段命名,表命名,视图命名,SQL语句书写参考
  14. android 位移传感器 坐标,位移传感器
  15. HyperLynx(三十一)高速串行总线仿真(三)
  16. freenom又行了-免费顶级域名白嫖一年,赶紧看看如何申请
  17. 已经安装了 AccessDatabaseEngine.exe,还是报错
  18. -nan(ind) 重载运算符以及结构体排序
  19. dell raid 恢复出厂设置
  20. 记录下2015申请apple开发者企业账号过程

热门文章

  1. 10个问题让你快速避开java中的jdbc常见坑
  2. 40个问题让你快速掌握Java多线程的精髓
  3. 想设计亿万级高并发架构,你要先知道高并发是什么?
  4. 充分释放数据价值:安全、可信6到飞起
  5. 【华为云技术分享】iSulad轻量化容器实践解析
  6. 【开发者portal在线开发插件系列四】数组 及 可变长度数组
  7. 挑战10个最难的Java面试题(附答案)【下】
  8. 设计模式的C语言应用-非典型模式-第十章
  9. 【Python3网络爬虫开发实战】1.6.2-Tornado的安装
  10. c语言 b的作用,在C语言中各个标点符号的作用