1.链表基础知识点:
单链表:
双链表:
循环链表:
链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理 依靠node进行联系 数组直接是连续的 下标就可以联系了
一个data 一个node(该struct类型指针)添加和删除节点都是控制node的指向
【C++跬步积累】——时间复杂度_时间复杂度c++_PH_modest的博客-CSDN博客
203.移除链表元素
1.自己思路:
就在传参进来的链表里面进行操作 循环结束判断条件为最后一个节点指向不为null 里面匹配val 相等在node->next = node->next->next 但是运行超时
2.题解思路:
第一种情况: 移除头节点
第二种情况:往下移动 但是注意需要释放删除的node
head是链表的第一个节点 将head赋值给cur(浅拷贝) cur再通过遍历(不断的变成下一个节点)
cur = cur->next对链接进行重新排序(注意 此时头节点即head是不可能改变的)cur的作用是遍历重新排序 但是重新排序的头节点还是head不会改变 即保护head node可以返回!!!
虚拟头的方法就是虚拟一个head 虚拟的head指向head 这样就可以再利用cur遍历修改链接(虚拟头节点不变)
第一次写粗心 释放的Node写错
代码完成通过
707.设计链表
思路:
自己思路错误在虚拟头节点的定义 cur作为遍历node 是从头开始的 所以cur = dummyhead->next;即确保了虚拟头节点 也确保了cur从head开始遍历
链表下标Index也从0开始计数
要注意特殊情况!!!
注意 遍历的节点cur 是选择虚拟头节点 还是真正的Head节点
选择虚拟头节点 while(index--)遍历到的为下标index前的节点
可以画图模拟运行或者加上打印函数
206.反转链表
1.自己思路:
用cur遍历到最后 得到最后的节点即为反转的head(但是此时该节点指向为null 没有指向下一节点)但是后续无思路 看到了提示双指针法 继续思考 自己思路想的是再弄一个节点 当作最后输出链表的头节点但是运行超时
2.题解思路:
1.自己思路基础上:
反转在pre和cur中直接进行 但是得保存本来cur->next 因为cur还需要继续向下移动 最后返回pre(因为while循环判断条件 最后cur会变成Null pre变成原先链表的最后一个节点)代码完成通过
2.递归法:
三部曲:1.传入参数
2.终止条件
3.进行递归
个人理解 递归就是将while循环分解 代码完成 通过