php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性

一、总结

链表反转两种实现方式:a、头插法(遍历一遍链表即可实现链表反转)  b、借助数组反转(遍历一遍链表将数值存在数组,反转数组,将数组里面的值尾插法插入链表,返回链表)

链表题一定记得画图

指向链表节点的指针本质就是一个记录地址的变量($p=链表,$p里面记录的就是一个地址),节点的next域里面记录的是下一个变量的地址

$p->next表示的是取p节点的next域里面的数值,next只是p的一个属性

二、php实现反转链表

题目描述:

输入一个链表,反转链表后,输出链表的所有元素。

代码:

代码一

 <?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
/*
思路: pHead始终指向要反转的结点
last 指向反转后的首结点
每反转一个结点,把pHead结点的下一个结点指向last, last指向pHead成为反转后首结点,
再把pHead向前移动一个结点直至None结束 */
function ReverseList($pHead)
{
if($pHead == null){ //1、这里多了一个判断
return null;
}
$pre = null; //2、pre是一个非常普通的变量,而不是节点变量,里面记录的是节点的地址,也算是节点变量
while($pHead != null){ //3、算法思路是把前面节点的地址拿到,放到下一个节点的next域中
$tmp = $pHead->next;
$pHead->next = $pre;
$pre = $pHead;
$pHead = $tmp;
}
return $pre; }

代码二(也是ac)

 <?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
//算法考点:链表的头插法和尾插法,头插法即可实现链表反转
//链表反转也可以借助数组反转来实现
function ReverseList($pHead)
{
$head = null;
//$end = null; //1、这两句话可有可无
//$head->next=$end;
while($pHead){
//$p=$pHead; //2、不能这样赋值
$p = new ListNode($pHead->val);
$p->next=$head->next;
$head->next=$p; //4、$head哪来的next域,无语了
$pHead=$pHead->next;
}
return $head->next; //3、输出的时候发现多了一个0,所以用$head->next消除前面的那个0 5、前面多的那个0是head的0,php把它当成了一个node节点变量
}

代码三:深入理解链表后的AC

算法思路:就是将前面节点的地址放到后面节点的next域中实现链表反转

<?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
//算法考点:链表的头插法和尾插法,头插法即可实现链表反转
//链表反转也可以借助数组反转来实现
function ReverseList($pHead)
{
$pre=null;
while($pHead){
$tmp=$pHead->next; //
$pHead->next=$pre; //1、将$pre变量里面记录的地址给$pHead的next
$pre = $pHead; //2、将$pHead的值(一个地址)给$pre变量
$pHead=$tmp;
}
return $pre;
}

php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性)的更多相关文章

  1. 链表算法题二,还原题目,用debug调试搞懂每一道题

    文章简述 大家好,本篇是个人的第4篇文章. 承接第3篇文章<开启算法之路,还原题目,用debug调试搞懂每一道题>,本篇文章继续分享关于链表的算法题目. 本篇文章共有5道题目 一,反转链表 ...

  2. LeetCode 上最难的链表算法题,没有之一!

    题目来源于 LeetCode 第 23 号问题:合并 K 个排序链表. 该题在 LeetCode 官网上有关于链表的问题中标注为最难的一道题目:难度为 Hard ,通过率在链表 Hard 级别目前最低 ...

  3. leecode刷题(21)-- 删除链表的倒数第N个节点

    leecode刷题(21)-- 删除链表的倒数第N个节点 删除链表的倒数第N个节点 描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...

  4. leecode刷题(20)-- 删除链表中的节点

    leecode刷题(20)-- 删除链表中的节点 删除链表中的节点 描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = ...

  5. [LC]83题 Remove Duplicates from Sorted List(删除排序链表中的重复元素)(链表)

    ①英文题目 Given a sorted linked list, delete all duplicates such that each element appear only once. Exa ...

  6. 剑指Offer编程题(Java实现)——链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 注意: 该题目不可以用先反转链表再输出第k个结点的方式,因为反转链表会改变该结点的next指向 思路一 使用栈Stack倒序存储,顺序pop第k个 ...

  7. 链表算法题之中等级别,debug调试更简单

    文章简述 大家好,本篇是个人的第 5 篇文章 从本篇文章开始,分享关于链表的题目为中等难度,本次共有 3 道题目. 一,两数相加 1.1 题目分析 题中写到数字是按照逆序的方式存储,从进位的角度看,两 ...

  8. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  9. IT公司100题-7-判断两个链表是否相交

    问题:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.1.如何判断一个链表是不是这类链表? 问题扩展:1.如果链表可能有环呢?2.如果需 ...

随机推荐

  1. wpf app全局变量传参方法(代码片段 )

    清空某行绑定的行数据: int RowIndex = datagrid.SelectedIndex; _Table.Rows[RowIndex]["AVERAGE_PRICE"] ...

  2. [分享]ip地址爬取过滤的shell

    http://www.hbbzy.me/分享ip地址爬取过滤的shell #!/bin/base #ip zhi地址匹配 #获取最新的ip地址 #author:haifeng #wget ftp:// ...

  3. 关于结构体COORD介绍

    COORD是windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标.其定义为: typedef struct _COORD { SHORT X; // horizontal coor ...

  4. Visual Studio Code配置GoLang开发环境

    Visual Studio Code配置GoLang开发环境 在Visual Studio Code配置GoLang开发环境 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页: ...

  5. Android NineGridLayout — 仿微信朋友圈和QQ空间的九宫格图片展示自定义控件

    NineGridLayout 一个仿微信朋友圈和QQ空间的九宫格图片展示自定义控件. GitHub:https://github.com/HMY314/NineGridLayout 一.介绍 1.当只 ...

  6. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  7. Reentrant 可重入解释

    作者:知乎用户链接:https://www.zhihu.com/question/37168009/answer/88086943来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. erroe:plot.new() : figure margins too large

    使用R时多次出现这个错误,plot.new() : figure margins too large,提示图片边界太大 解决方法,win.graph(width=4.875, height=2.5,p ...

  9. swift -结构体

    // // main.swift // Struct-Demo-05 // import Foundation println("结构体測试!") //结构体和C语言的结构体不同 ...

  10. Font Awesome 图标如何使用

    Font Awesome 图标如何使用 一.总结 一句话总结:Font Awesome字体图标非常好用,直接引入font-awesome.css,然后就可以直接使用了,使用的时候是用的i标签. 1.字 ...