zoukankan      html  css  js  c++  java
  • 剑指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 ,*nm++);
            }

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



  • 相关阅读:
    git rror: RPC失败
    linux加载模块报错:could not insert module xxx.ko: Unknown symbol in module
    Ubuntu 20.04 添加当前用户 Root 权限
    C程序编译过程
    静态代码块和非静态代码块
    java反射
    ==和equal的区别
    solr中配置域
    Solr的简介以及安装
    Spring Data Redis 小demo
  • 原文地址:https://www.cnblogs.com/huicpc0212/p/4770545.html
Copyright © 2011-2022 走看看