最近在找实习,考的是leetcode的题目,被完虐了,决定狠下心来好好学习,今天要弄懂链表。
首先在面试过程中让手写代码,需要注意的地方,class 后面的__init__函数,不要犯基本的错误,挺丢人的。
好了步入正题,主要参考这篇文章https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484127&idx=1&sn=d681b847e69e3a7fd729e3b480731aa1&chksm=fa0e6d5ecd79e4487f4427433682a9d7dc2d115224c2e3b5b10ca1dd37781f1201013cbd6584&mpshare=1&scene=1&srcid=0906rYLNJqGuqnjz2rP6TfMj&sharer_sharetime=1567750044735&sharer_shareid=681b9acc86a464fe16d7d37df2b991c3&pass_ticket=FwvEAn%2Fe9aWDV2a9bX9IChtPP5aBdf%2F3IX8imiYGHwtYybakfKNUl4HjuIJolhed#rd
链表,他具有动态的能力,不需要处理固定容量的问题,插入删除都会比数组来的简单一点,而麻烦之处就在于,他缺失了高效的随机访问的能力,无法通过索引直接获取对应的元素,在数组中能直接寻找索引的原因是数组开辟的空间在内存中是连续分布的,直接计算出数据所存储的内存地址,用O(1)复杂度可以拿出。
链表需要用next查找,每个节点的存储地址不同。
1、链表的插入
需要注意顺序,先在insert_node后面加上原来的后部节点,再把这一段加在原来的前部节点的后面
2、虚拟的头结点,dummyHead
用关键字new生成 dummyHead=new Node(null,null)
虚拟结点的位置索引可以置为-1
3、链表的删除元素的操作
4、链表的查找元素的操作
5、链表的修改元素的操作
6、一般会用到的:dummyHead 做遍历挂载,一个真正的头结点,一对经常搭配使用,cur遍历,pre前驱
7、还有常见的题目:删除倒数第k个节点,k个或两个有序链表的结合,翻转整个链表
8、一直的困惑解决:创建一个链表时创建的名字不要动,比如创建的是node,之后使得cc=node,这时候cc相当于是node的一个指针,更改他会更改后续的内容,不要直接在创建名上改√
9、遇到链表问题先考虑当前链表为空以及链表的下一个结点是空的情况
10、考虑用递归的方式解决问题,效率更高
11、有一道题目是翻转链表2,写的时候有几点没有注意的地方,
(1)是当m=n的时候,应该直接返回原来的链表,没考虑特殊情况
(2)当m=1的时候会比较特殊,因为他从刚开始就要翻转,解决这个问题的比较好的方法就是在链表前面加一个0的节点,这样就可以和其他的一样看待了