碎碎念:
作为一个看到数据结构就脑阔痛的菜鸟,今天心血来潮,尝试进行一个链表题目的小练。
自己想了各种选择结构来引导程序方向,看了答案才发现根本不需要这么繁杂的步骤。
虽然是个小题目,但是还是自己反思了一下为什么会有这么明显的思维差异,浅记如下。
题目——移除链表元素:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点
题目来源:LeetCode 203。
解题流程
我的解法
先上我的代码:
# class Node:
# def __init__(self,data,next) -> None:
# self.data = data
# self.next = next
""""生成的链表带有data为None的头结点"""
def delete_val_linklist(self,val):
"""移除单链表元素"""
h = self.head # h始终是当前观测的结点
while h.next:
if h.next.data!=val : # 如果当前h结点的data不是val,就后移h
p = h.next
h = p
else: # 如果当前h结点的data是val,就进行细化操作
p = h.next
if p.next:
h.next = p.next
if p.next.data != val:
h = p.next
else:
p = h.next
else:
h.next = None
这里我为了解决目标结点是 ①头结点后第一个结点、②是最后一个结点、③遇到连续几个目标结点 等情况,对可能出现的情况全部考虑进了if选择结构。
经过第二遍复查,才发现代码中没有抓住最主要的步骤——h结点的转移,同时还存在无效变量的定义,如第一个if中 的“p = h.next ; h = p
”,其实完全可以用h = h.next
解决,清晰高效。
简洁解法
def delete_val_linklist_1(self,val):
h = self.head
while h.next:
if h.next.data == val:
h.next = h.next.next
else:
h = h.next
是在下输了。。
扫描二维码关注公众号,回复:
15575171 查看本文章
拿捏住一个是目标点就往后跳两步,不是就跳一步,知道哪个结点的next是None,哪个不是。
一些反思:
感觉对数据结构还是有畏难心理,总想着用解决方法会比较复杂,以及为了完整理清链表各结点之间的联系,对每一步都进行了细化,所以会写的不够简洁。
另一方面,可能和自己的性格有关,容易去考虑各种细枝末节or特殊情况,而抓不住主要矛盾。