阿里云服务器可以做几个网站,博罗高端网站建设价格,市场营销策划书模板,铁路建设网站多少中期答辩改在了国庆之后#xff0c;终于有时间可以看看剑指offer了。在看到单向链表的部分#xff0c;对指针#xff0c;尤其是头指针有点疑惑。首先容易理解的是链表的节点是一个结构体#xff0c;该结构体包含一个数据#xff08;一般是int型#xff09;#xff0c;还…中期答辩改在了国庆之后终于有时间可以看看剑指offer了。在看到单向链表的部分对指针尤其是头指针有点疑惑。首先容易理解的是链表的节点是一个结构体该结构体包含一个数据一般是int型还包含一个指向该结构体类型的指针。通过指针的指向一个个遍历也是通过指针一次次分配内存。这使得链表不同于数组链表中的内存不是连续的我们想要访问一个结点只能从头结点开始。其实数组之所以能通过数组下标进行访问也是因为事先设定了一个基准点。只不过在链表中这个基准点头指针很重要。现在就来好好研究一下头指针、头结点的那些事。 在书中提供的代码中无论是在链表末尾插入新的结点还是在链表中删除具有某值的结点都有两个共同点。一是函数的第一个参数类型是指向结点数据类型的指针的指针一是将代码分为两部分第一部分都是通过头指针是否是空指针判断该链表是否是空链表或者判断头结点中的数据是否和参数相等。这里提到了两个重要的概念头指针和头结点。
struct ListNode
{int value;ListNode * Next;};void addTotail(ListNode ** head, int value){//第一个参数是头指针的指针因为头指针在变ListNode* newlistnode new ListNode();newlistnode-value value;newlistnode-Next NULL;//新建一个节点数据等于参数指针为空if (*head NULL){//头指针指向下一个节点*head newlistnode;//空链表中插入节点则头指针不再是空指针第一个形参应改变}else {//链表不空时递归直到链表尾空指针ListNode* pNode *head;while (pNode-Next ! NULL){pNode pNode-Next;}pNode-Next newlistnode;}
} 可以看到空指针相对于数组名是链表的名字它是指向下一个结点的指针的指针至于为什么是双重指针这涉及到函数中参数值的传递。因为在链表中插入我们要讨论该链表是否是空链表进行不同的操作而插入这个操作会使得空链表不再空即使得原来空链表的头指针指向空指针变成了指向一个真实的结构体我们需要在执行完一次函数后修改头指针这个形参方便之后再次调用这个函数。
函数中值的传递方式有三种值传递地址传递引用传递。
值传递只传递了形参的值因为在函数内部会新建值等于参数的副本形参函数中的操作只是对副本进行修改不会改变实参的原始大小。实参是主函数调用函数时传递的值形参是函数定义时使用的值。一个很形象的例子就是餐厅中有保鲜膜包好的样品菜你指给厨师说要菜A厨师会拿新的食材重新做一份而不是直接把样品给你。如果真的想要样品中的菜那么就要借助装样品的盘子了盘子就相当于地址这就是地址传递。Java中只有按值传递这也是java简单的原因。
引用传递。首先搞清楚引用是怎么回事引用是两个变量名表示同一个东西不会分配新的内存可以认为引用是目标变量的一个别名。通过引用修改变量势必引起原始变量发生变化。
下面说一下今天遇到的主角指针传递。这里更特殊的是使用了双重指针。这里有一句比较容易引起混淆的话其实一切传递的方式本质都是按值传递。简单来说双重指针通过传递地址变量和地址指针指向的内容实现了可以通过函数对参数的地址和内容值进行修改。
先看下面一个代码代码中第一个参数是指向int型的指针传入a的地址。可以理解为a是按值传递的这样在执行函数时会有一个a的地址的拷贝这个拷贝同样指向a这样当我们在函数中修改拷贝中的内容即便这个拷贝最后被释放还是会改变a的值。
void change(int *_a,int b){
*_ab;
}
void main(){
int a10,b20;
int *p_aa;
change(p_a,b);
printf(%d,*p_a);
}既然单指针作为形参已经可以实现通过函数修改实参为什么还要使用双重函数呢可以注意到我们刚才把a的地址当做按值传递而函数目标是修改按值传递的地址指向的内容但是当我们函数的目的是修改地址本身时又回到了按值传递的老路上这样是不能实现目的的。借鉴刚才的通过指针改变指针指向的内容我们再加一层指针指向变量的地址即指针的指针这就有了双重指针。
再说回头指针和头结点。头指针是必要的头结点更多是为了操作统计和方便其数据域一般无意义可以用作监视哨或者存放链表的长度。代码中只要头指针运用了next操作就自动创建了头结点。再从表示的意义理解一下双重指针ListNode ** pHead它是指向结构体ListNode的指针的指针那么*pHead表示的就是指向ListNode的一个指针。
Reference
盘子https://blog.csdn.net/ThereIsNoCode/article/details/77996799双重指针https://blog.csdn.net/qq_33631303/article/details/78007413https://blog.csdn.net/xmrforever/article/details/3915665https://blog.csdn.net/playboy_lei/article/details/51993513