学习目标:
理解链表的理论基础完成力扣题目
学习大纲:
-
链表理论基础
-
203.移除链表元素
-
707.设计链表
-
206.反转链表
学习时间:
1:00-4:00
学习内容:
a.链表理论基础
1.链表类型: 单链表 双链表
单链表:指针域只能指向节点的下一个节点
双链表:两个指针域,一个指向下一个节点一个指向上一个节点
循环列表:链表首位相连
2.链表的存储方式:
链表是通过指针域的指针链接在内存中各个节点,所以链表中的节点在内纯种不是连续分布的。
分配机制取决于操作系统的内存管理。
3.链表的定义:
ListNode* next;
ListNode* head = new ListNode();
4.链表的操作:
删除节点即讲节点的指针指向改到下一个节点即可
添加节点上一个节点的指针指向添加节点,添加节点的指针指向下一个节点
5.性能分析
@代码随想录
b.203.移除链表元素
移除给定值val的节点
思路:
当链表中的数等于val的时候,指针指向下一个节点
执行出结果,但是提交报错
代码随想录视频讲解
1.移除头节点的情况
2.移除非头节点的情况
3.虚拟头节点的方法 -> 方法统一(删除所有节点的方法)
思路 :
1.创建一个虚拟头节点 指向头节点
2.链表中所有节点此时为非头节点
3.当next->val = target的时候,指向下下个节点
4.删除虚拟头节点,返回头节点
c. 707设计链表
get(Index):
返回第index个节点的值
思路:
一直指向下一个节点直到指向查找的Index节点返回index的值
addAtHead(val)
插入值为Val的节点作为头节点。
思路:
将新建值为val的节点指向原头节点。
addAtTail
插入值为Val的节点作为尾节点。
思路:
用while遍历,遍历到结尾时将原尾节点指向新节点。
addAtIndex
插入值为Val的节点在index的位置。
思路:
将新建值为val的节点在index的位置插入。
上一个节点指向,此节点指向下一个节点。
deleteAtIndex
删除值为Val的节点在index的位置。
思路:
将index的位置节点删除。
上一个节点指向下下个节点。
代码随想录视频:
1.统一使用虚拟头节点的方式
//即dummyhead
2.链表头节点即n=0
3.遍历链表的时候定义cur节点(遍历过后返回头节点)
//如果直接操作head会改变head
-->cur=dummyhead->next
4.考虑边界问题
5.插入节点时要new node进行插入
6.先指向下一节点,在建立与上一个节点的联系
/*newnode->next = head;
dummyhead->next = new node;*/
7.尾部节点遍历边界(cur->next == null)
8.第n个节点即n--.
9.更新size的大小
。。。自行代码随想录网站扒答案。
这个地方要注意,index>=_size,当等于的时候也是,删完跟大于的时候也是一样的结果。