以图明志

数据结构

[专题] 如何判断链表是否有环的存在

“快慢指针”的使用
有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D。如何判断一个单链表是否有环呢?这个可以用昨天提到的“快慢指针”来解决吧?设两个工作指针,一个快一个慢,如果有环的话,它们会必然在某点相遇。

数据结构

[专题] 获取单链表中的指定位置的元素

工作指针的概念
单链表作为一种数据结构,存取数据是其很基本的操作。今天我们来看一下,如何获取单链表指定位置的元素。在单链表中,由于第i个元素到底在哪是没办法一开始就知道,必须得从头开始找。我们可以先设计一下单链表实现获取第i个元素的数据的操作GetElem()函数。

数据结构

[专题] 单链表的头指针、头结点与首元结点

几种单链表的区别
链表也是一种线性表,所以总得有个头有个尾。链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。这里有个地方要注意,就是对头指针概念的理解,这个很重要。“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针。

C/C++编程语言

C语言使用指针访问数组

下标与指针其实是等价的
如果pa指向数组中的某个元素,那么pa+1将指向下一个元素,pa+i指向下i个元素。所以,若果pa指向a[0],那么*pa其实就是a[0],*(pa+1)就是a[1],*(pa+i)就是a[i]。根据这个思路,我们可以使用指针来访问数组。

JavaScript

[专题] 执行上下文其四:This指针

任何对象都可以作为上下文的this值
任何对象都可以作为上下文的this值。我想再次澄清对与ECMAScript中,与执行上下文相关的一些描述——特别是this的误解。通常,this 被错误地,描述为变量对象的属性。这个特点很重要,因为和变量不同,this是没有一个类似搜寻变量的过程。当你在代码中使用了this,这个 this的值就直接从执行的上下文中获取了,而不会从作用域链中搜寻。

PHP服务器脚本

PHP数组中的指针小思考

使用each()函数调用函数reset()将数组指针重置
最近在工作中遇到一个很奇怪的问题,在使用each这个函数对一个数组遍历之后,再把该数组作为实参传递给一个函数,在函数内部再次使用each遍历形参数组。说明一下,两次使用each这个函数的目的很简单,就是将数组中的key转换成变量名,而key对应的value值转换成变量的值。其实这个功使用函数extract就能实现。在来接着说说在函数内部使用each函数时出现了什么问题。

数据结构

用快慢指针判断单链表环,找到环入口

扩展到判断两个链表是否相交
快慢指针在解决单链表环问题的时候是非常有用的,下面来探讨一下单链表的环的一些问题。有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。

数据结构

腾讯面试题:快速找到未知长度单链表的中间节点

快慢指针在单链表中很有用处
普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:设置两个指针*search、*mid都指向单链表的头节点。其中* search的移动速度是*mid的2倍。当*search指向末尾节点的时候,mid正好就在中间了。这也是标尺的思想。

数据结构

[专题] 结构之美:单链表的头结点与头指针

理解单链表的两个重要概念
当链表的每个结点只包含一个指针域时,我们称此链表为单链表。关于单链表的存取,有时候我们在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点;指向头结点的指针,称之为头指针;对单链表的存取必须从头指针开始进行,由于单链表的最后一个数据元素没有直接后继,则指针为NULL。

C/C++编程语言

[专题] C语法陷阱:C语言的二维数组模拟

用指针与一维数组理解与构造
现在我们可以考虑二维数组了,正如前面所讨论的,它实际上是以数组为元素的数组,尽管我们也可以完全依据指针编写操纵一维数组的程序,这样做在一维情形下并不困难,但是对于二维数组从记法上的便利性来说采用下述形式就几乎是不可替代了。还有,如果我们仅仅使用指针来操纵二维数组,我们将不得不与C语言中最为“晦暗不明”的部分打交道,并常常遭遇到潜伏着的编译器bug。

C/C++编程语言

[专题] C语法陷阱:指针与数组

理解指针与变量间的关系
如果一个指针指向的是数组中的一个元素,那么我们只要给这个指针加1,就能够得到指向数组中下一个元素的指针,同样的,如果我们给这个指针减一,得到就是指向该数组中前一个元素的指针。对于除了1以外的其他整数的情形,以此类推。上面这段讨论暗示了这样一个事实:给一个指针加上一个整数,与给该指针二进制表示加上同样的整数,两者的含义截然不同。

C/C++编程语言

[专题] C语法陷阱:理解(*(void(*)())0)()

用(void (*)())0来替换函数指针fp
拥有了前面的预备知识,我们现在可以分两步来分析表达式 (*(void(*)())0)() 。第一步,假定变量fp是一个函数指针,那么如何调用fp所指向的函数呢?因为fp是一个函数指针,那么*fp就是该指针所指向的函数,所以(*fp)()就是调用该函数的方式。

C/C++编程语言

[专题] 漫谈C指针:函数指针作为函数参数使用

附加一个实例
既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。要求:我要设计一个CallMyFun函数,这个函数可以通过参数中的函数指针值不同来分别调用MyFun1、MyFun2、MyFun3这三个函数(注:这三个函数的定义格式应相同)。

C/C++编程语言

[专题] 漫谈C指针:定义函数的指针类型

用这个类型来声明函数指针变量
就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来声明函数指针变量。首先,在void (*FunType)(int)前加了一个typedef 。这样只是定义一个名为FunType函数指针类型,而不是一个FunType变量。然后,“FunType FunP;”这句就如“PINT px;”一样地声明一个FunP变量。

C/C++编程语言

[专题] 漫谈C指针:函数调用的指针写法

用多种方法来调用函数
有了FunP指针变量后,我们就可以对它赋值指向MyFun,然后通过FunP来调用MyFun函数了。看我如何通过FunP指针变量来调用MyFun函数的: (*FunP)(20); 运行看看。嗯,不错,程序运行得很好。哦,我的感觉是:MyFun与FunP的类型关系类似于int 与int * 的关系。函数MyFun好像是一个如int的变量(或常量),而FunP则像一个如int * 一样的指针变量。

C/C++编程语言

[专题] 漫谈C指针:指向另一指针地址的指针

只是指向指针的指针而已
在前文中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是9。同样的,我们也可能让某个指针指向这个地址。第一句:short int **ppi; —— 声明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。
1 / 2 首页 < Prev 1 2 Next > 尾页 页码: