第三天:链表part01
LC203移除链表元素(未掌握)
- 未掌握分析:
- 思维定式,删除元素定义一个before==null,cur和next。未考虑到before是null没有next
- 未掌握虚拟节点的使用方法:ListNode before = new ListNode(-1 ,head)
- 后续补充:如果需要return head,一般return dummpy.next()才是正确的
- 未掌握链表操作的两种方式
- 直接使用原来链表操作,需要单独判断是否是head节点
- 头节点满足:直接head = head.next
- 头节点不满足:常规操作
- 设置一个虚拟节点来进行操作:所有的节点都可以按照统一的方式移除
- 直接使用原来链表操作,需要单独判断是否是head节点
- 代码:
- 直接使用原链表操作:
- 设置虚拟节点:
- 错误写法:错在虽然设置了虚拟节点,但是如果链表元素全部都等于val,此时head仍然可以得到原链表
- 正确写法:
- 错误写法:错在虽然设置了虚拟节点,但是如果链表元素全部都等于val,此时head仍然可以得到原链表
- 直接使用原链表操作:
LC707设计链表(未掌握)
- 未掌握分析:未对链表的知识点形成完整的知识体系,需要多次复习
- 思想:使用了虚拟节点的方法,这样所有节点的所有操作都是统一的
- get函数:需要判断index是否非法,不非法,由于使用了虚拟节点,因为第0个节点的dummpy.next
- addAtIndex函数:精髓函数,可以拓展为addAtHead和addAtTail
- 判断index是否非法,即index>size
- 判断index是否<0,<0重新将index设置为0
- 添加元素,需要找到index元素的前一个元素,第0个节点的前一个元素是dummpy
- deleteAtIndex函数:与addAtIndex元素类似,都是判断index是否非法,然后找到前一个元素,再删除元素
- addAtHead和addAtTail函数:直接调用addAtIndex函数即可
- 代码:
LC206反转链表
- 新思路:使用递归法反转链表,递归比较难理解,多看多理解
- 代码