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

碎碎念:

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

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

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

题目——移除链表元素:

给你一个链表的头节点 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特殊情况,而抓不住主要矛盾。


猜你喜欢

转载自blog.csdn.net/weixin_50593821/article/details/125446620