什么是链表
是一种数据结构,数据结构就是数据存放的思想。
链表是一串数据,地址不一定是连续的。
与数组对比:数组地址也是连续的,但删一个元素或 者加一个元素将变得很麻烦。因而有了链表,链表就是在结构体里面定义一个指针,指向下一个结构体,这样就把结构体串起来了。
链表的动态编译时,要用指针是因为判断条件是NULL,而后插法,前插法用指针是因为要改变main函数里面next的值来实现链表的前插和后插。
尾插法:在p的后面插入。关键点:判断p是否为空;判断p的score是否等于data。等于的话,把new插进去,new->next=p->next;p->next=new。
头插法:在p前插入。关键在于要改变head,因为头可能会变,所以要用指针改变head。分两种情况:第一,判断第一个数是否是目标数。是的话直接在第一个数前面插入。代码为:struct test* head = p; new->next=head; return new。
第二种情况,第一个不是目标,那就用while(p->next!=NULL),再用if判断p->next->score==data即可。
注意插入成功后要返回head,不然会陷入死循环一直打印要插入的数。
删除指定节点:
链表动态创建之头插法
链表动态创建之后插法
单链表实现反转(逆序输出)
方法1:迭代法
如图所示,创建三个指针。小方块从左到右的值分别为1、2、3,假设
是以1->2->3的方向,那么,如果想实现链表反转,可以让中间的mid->next
从原来指向end变为指向pre,然后三个指针整体向右移动,mid再指向pre,直到end指向了NULL为止。最后让头指针指向mid即可,此时方向变为3->2->1
方法二:递归
该方法是通过递归,使得指针指向最后一个结点,然后从后往前改变指针的指向,从而实现反转。
最重要一点,必须把p指针的next至为空,不然编译时会不断循环。
逻辑图如下:
if判断返回的p值是返回到上一层的函数中,不是返回到主函数里面,再通过else的操作,一层层的返回,直到返回到主函数里面去。