今天的打卡内容与链表有关,第一次接触链表,个人感觉十分陌生和晦涩,花费大约2h在学习和理解链表的概念和代码上(链表好难o(╥﹏╥)o)
参考视频包括但不限于:
https://www.bilibili.com/video/BV1FU4y1X7WD/share_source=copy_web&vd_source=1261b97a33f42388f92b473554874c36
题目1.
203.移除链表元素
关键在于引入了虚拟头节点dummy_head(反复听了好几遍),它使得我们不需要单独处理头节点被删除的情况。在遍历链表时,我们总是检查current.next的值,并根据需要调整current.next的指向,从而跳过值为val的节点。最后,返回dummy_head.next作为删除所有值为val的节点后的链表头节点。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeElements(self, head, val):
'''
这段代码实现了一个在单链表中删除所有值为val的节点的功能,
通过引入一个虚拟头节点(dummy head)来简化删除操作。
创建一个虚拟头部节点,其next指针指向原链表的头节点head
这样做的好处是:我们不需要单独处理头节点被删除的情况
'''
dummy_head = ListNode(next=head)
# 初始化当前节点为虚拟头部节点,这样我们就可以从虚拟头部节点开始遍历链表
current = dummy_head
# 当current的next不为空时,继续遍历链表
# 这里我们检查current.next是因为我们是在考虑删除current.next指向的节点
#如果current.next存在,我们就进入循环体
while current.next:
# 如果当前节点的下一个节点的值等于val,则删除该节点
# 通过将current.next指向current.next.next,即跳过了值为val的节点
if current.next.val == val:
current.next = current.next.next
# 如果当前节点的下一个节点的值不等于val,则继续向后遍历
else:
current = current.next
# 遍历结束后,dummy_head.next即为删除所有值为val的节点后的链表头节点
# 因为我们是从虚拟头部节点开始遍历的,所以即使原链表的头节点被删除,我们也能通过dummy_head.next找到新的头节点
return dummy_head.next
感觉一段时间后又会忘记思路了,作此文章,以便日后复习~
题目2.
707.设计链表
摸了,真的好难,思路看了又忘,救命,我先洗洗睡了
题目链接/文章讲解/视频讲解:代码随想录
总结:链表重在理解,难在实操。