剑指offer之O(1)算法删除指针所指向的节点

题目如图:

1.把要删除pToBeDeleted的节点的后面节点覆盖点要删除的节点pToBeDeleted

2.要考虑如果删除的节点是最后一个节点怎么办

3.要考虑如果总共只有一个节点,删除的是头结点或者说是尾节点怎么办

———————————————————————————————————函数指针的用法,一个特例,将所有的奇数移动到所有的偶数前面——————————————————————————————————————————————————————

是和快速排序的思路是相同的,就是在函数调用的时候使用了一个函数指针的形式,对于函数指针开始的时候不熟,现在对函数指针进行一个学习或者复习的过程。

对于一些模糊的概念进行整理:

首先看的指针函数和函数指针有什么区别:

(1)指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

  定义的形式是:     类型标识符    *函数名(参数表)

首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

表示:

float *fun();

float *p;

p = fun(a);

(2)注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数

函数指针是指向函数的指针变量,即本质是一个指针变量。

 int (*f) (int x); /* 声明一个函数指针 */

 f=func; /* 将func函数的首地址赋给指针f */

类型说明符 (*函数名)(参数)

其实这里不能称为函数名,应该叫做指针的变量名。

(3)指针的指针

声明的形式:char ** cp;

因此会有如下的解释

指针的指针需要用到指针的地址。
        char c=‘A‘;
        char *p=&c;
        char **cp=&p;
    通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:
        char *p1=*cp;
        char c1=**cp;

关键在于熟练掌握操作符的优先级和++的使用方法*p=*p+1;此处*为间接访问,P指向的地址内容+1后的值赋给P指向的地址 *p++;//这里*和++为同一优先级,P先和++结合;右移P++是先使用P的值,后P的值+1        //*p++和*p=*p+1的区别是后者是P指向的地址的值+1,前者是P的地址+1,所有后者、即单独的*p++;等价于P++,是一种容易误解的写法,在实际程序中不会用到*p++;这样的语句 *++p;//类似,先是P指向先一个单元,再间接访问P指向的地址的值,同样没有单独使用 *++p;语句,如果单独使用 *++p;则和++p等价

(4)指向指针数组的指针指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串

其中的一个样例的使用是这样的:char *Names[]=        {             Bill,             Sam,             Jim,             Paul,             Charles,             0        };

        main()        {            char **nm=Names;            while(*nm!=0) printf(%s\n,*nm++);        }

注意数组中的最后一个元素被初始化为0,while循环以次来判断是否到了数组末尾。具有零值的指针常常被用做循环数组的终止符。程序员称零值指针为空指针(NULL)。采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。
时间: 2024-07-29 23:54:38

剑指offer之O(1)算法删除指针所指向的节点的相关文章

剑指offer之【二叉搜索树的第k个节点】

题目: 二叉搜索树的第k个结点 链接: https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=11215&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tPage=4 题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \

剑指offer (13) O(1)时间删除单链表结点

单链表删除结点操作: 方法一.  从链表的第一个结点开始遍历,顺序遍历到需删除结点的前一个结点,然后调整指针指向  T(n) = O(n) 方法二.  将 需删除结点i的下一个结点j(如果存在) 的值赋值给 需删除结点i,然后 删除结点j,这就相当于删除了结点i  T(n) = O(1) 需要注意以下几点: 1. 如果待删除结点为单链表尾结点,此时 其后无后继结点,这时需要 从链表开头开始 顺序遍历查找 待删除结点的前驱结点 2. 如果单链表就只有一个结点,且需要删除头结点,此时 需要修改链表头

[剑指offer]Q13:O(1)时间删除链表的结点

通常我们所说的删除链表的某个结点,是彻底删除该结点的空间.而要这么做就必须知道其前驱结点.这里的想法是,链表中存储的val是同类型的,仅仅要将该结点的val内容删除就能够了. 那么就能够用该结点的后继结点的值覆盖当前结点,然后删除其后继结点,而对于其后继结点而言,该结点就是前驱. 这里仅仅须要考虑当前删除的结点是否为last node 就能够了.至于是否是头结点.这样的情况是能够归为同一种情况的.仅仅是參数要稍作改动. void delNode(ListNode **head, ListNode

剑指offer第二版面试题7:二叉树的下一个节点(JAVA版本)

题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况: 1.有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点: 2.没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点: 3.如果不是其父节点

【剑指Offer学习】【面试题:二维数组中的查找】PHP实现

最近一直看剑指Offer.里面很多算法题.于是就想着用PHP来显示一下. 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 拿到这个题目.我们第一个反应,就是遍历二维数组.然后逐个进行比较.我们不难用PHP进行实现.于是有了下面的代码 1 function TwoArrayFind($array,$search) { 2 $found = false; 3 4 if(e

剑指offer算法总结

剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看了几遍多做了几遍多了点心得体会.于是想总结一下.如果有错误也希望能指出,谢谢. 具体代码可以参考我的GitHub仓库: https://github.com/h2pl/SwordToOffer 数论和数字规律 从1到n整数中1出现的次数 题目描述 求出1~13的整数中1出现的

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*

【剑指offer】删除在另一个字符串中出现的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.如何判断那些字符是需要删除的字符.同很多字符串问题一样,可以开辟

【剑指offer】删除字符也出现在一个字符串

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.比如.输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.怎样推断那些字符是须要删除的字符. 同非常多字符串问题一样.能够