关于一个链表的易题难解让我怀疑自己的智商

碎碎念:

作为一个看到数据结构就脑阔痛的菜鸟,今天心血来潮,尝试进行一个链表题目的小练。

自己想了各种选择结构来引导程序方向,看了答案才发现根本不需要这么繁杂的步骤。

虽然是个小题目,但是还是自己反思了一下为什么会有这么明显的思维差异,浅记如下。

题目——移除链表元素:

给你一个链表的头节点 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

是在下输了。。

拿捏住一个是目标点就往后跳两步,不是就跳一步,知道哪个结点的next是None,哪个不是。


一些反思:

感觉对数据结构还是有畏难心理,总想着用解决方法会比较复杂,以及为了完整理清链表各结点之间的联系,对每一步都进行了细化,所以会写的不够简洁。

另一方面,可能和自己的性格有关,容易去考虑各种细枝末节or特殊情况,而抓不住主要矛盾。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值