数据结构——单向链表部分操作及valgrind安装
很多时候,由于忽略了对堆区空间的释放,会造成内存泄漏,所以在Ubuntu下linux有一个内存探测工具:valgrind
步骤:
1,虚拟机,设置,网络适配器,桥接模式,确定
2,编辑,虚拟网络编译器,更改设置,VMnet0(没有就创一个),桥接到PC正在上网的网卡上,应用,确定
3,配置网络文件:sudo vim/etc/network/interfaces,打开之后会有一串代码,只保留以下部分,剩下的用#注释掉
auto lo
iface lo inet loopbackauto ens33
iface ens33 inet dhcp
4,重启网络服务:sudo/etc/init.d/networking restart
5,ping www.baidu.com
6(安装),sudo apt-get install valgrind
7,对于部分虚拟机需要删除两个文件,会在安装时提示有文件锁上(lock),需要删除才能正常下载
上图的意思就是内存泄漏的意思,只需在运行文件之前加上vilgrind即可
单向链表各种操作
查找链表的中间节点
采用快慢指针法,定义两个结点指针, 快的指针速度是慢的指针速度的两倍,所以当快指针到达末尾时,慢指着则到达中间部分,如果是偶数则会多一层判断是否访问到不该访问的区域
当然如果有clen(结点个数),只需循环clen/2次即可
查找链表倒数第K个结点
倒数第k个结点,就是正数第clen - k + 1个结点,只需进行转化,按照普通的遍历即可
没有结点个数时,依然采用快慢指针,快指针比慢指针多访问了K个结点,所以等到指针为空时,慢指针便访问到所求结点,图中由于i<n导致快指针少移了一次,所以在下一个while循环中指向最后一个节点而非空指针
链表逆序
由于头插法最后顺序相反,所以逆序时再用一次头插法即可,从第二个结点开始一次头插,其中需要保留本结点地址以及下一结点的地址,故有两个指针
排序
首先判断该链表是否为空链表,若不是则进行下一步操作,从第二个结点开始,如果数值大于等于头节点,则向后排,直到排到比它小的,如果比头节点小,则进行头插法
判断链表是否为环
快慢指针法,如果不是环,则必定有NULL,如果是环的话,循环终止条件则是快指针等于慢指针时,此时快指针绕完环一定会和慢指针相等