203.移除链表元素
背景:
题目要求:删除链表中所有val元素,返回新链表的头节点。【python没有内置链表,使用list模拟链表内容】
观察示例:链表可能为空不存在val,可能存在val删除并返回头节点
思路:
链表的类属性为val和next,即链表只能获取当前元素的值以及指向下一个元素的位置。
A->B->C 删除链表的元素B的做法:将A->C,即A.next=A.next.next
注意链表非空状态才能判断【因为可能存在首节点为空,则使用虚拟头节点:新建一个节点指向原链表】,否则返回链表本身。
实践:
复盘:增加虚拟头节点 好用!
————————————————————————————————————————
206.反转链表
背景:
- 题目要求:将链表反转即第一个元素的值和最后一个元素的值交换,依次类推
- 观察示例:链表为空,返回空;链表有值,返回反转链表的头节点
思路:
链表非空情况才进行反转,否则返回链表本身。
链表反转(链表只能获取节点的值和指向下一节点的位置)示例A->B->C->D, A.next=B, B.next=C,C.next=D,D.next=None;
反转之后A.next=None,B.next=A,C.next=B,D.next=C;
- 思路1:链表指向不变,改变链表元素的值,将第一个元素值交换至最后一个后,剩余元素仍需要再次交换,行不通
- 思路2:改变链表的指向,依次将当前指针指向上一节点,当前节点要指向上一节点则第一个节点指向None,最后一个节点指向上一节点(while 当前节点不为None),一个指针pre用于存放上一节点,一个指针用于移动节点依次将每一个节点改变指向(通过cur节点移动至tmp即可),因为当前节点指向上一节点后即与之后节点断开连结,所以每次需要临时变量存储下一节点位置(需要第一步操作),用来找到下一节点的位置;最终返回反转后的头节点即为pre(因为cur因为要移动值最后节点的位置None)
实践:
复盘:
可能有更好的解法,but先消化此思想,总结为想一次遍历反转链表,则需要依次将链表指向上一节点,
————————————————————————————————————————
707.设计链表
背景:构造链表类,实现获取(按指标位置获取)/增(头部插入/尾部插入/按照坐标插入)/删除节点
思路:因为有删除,统一按照虚拟头节点处理,获取:遍历至指定节点返回val; 头部插入:虚拟头节点指向新的val ,size+1;尾部插入:遍历至尾部,指向新节点; 按坐标插入:遍历至指定坐标后,暂存下一节点位置,当前节点指向新节点,新节点指向暂存位置;删除指定坐标节点,遍历至坐标位置,当前节点指向下下节点
实践:
复盘: