leetcode链表刷题:删除中间节点

题目如下所示:
leetcode链表刷题:删除中间节点_第1张图片
这道题正如评论区所言,最大的难度就是读懂题目本身。这道题的意思是:有一个链表,题目给了我这个链表上除了第一个和最后一个节点以外的一个中间节点。然后我要把这个中间节点给删掉。也就是说,我们能够进行操作的,是一个链表上的一个节点。
知道了这个,那题目就不难了。我最开始想的方法比较笨,把所有节点都给改了一遍:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        if node.next:
            node.val = node.next.val
            if not node.next.next:
                node.next = None
            else:
                self.deleteNode(node.next)

但是这种方法,执行效果很诡异……多执行几次就会发现每次执行的速度差别很明显:
leetcode链表刷题:删除中间节点_第2张图片
上面的两个执行结果是同一段代码跑出来的,我也不懂为啥会这样……
然后我想了一下,似乎只要把这个节点的val和next给改成下一个节点对应的值就好了,并不需要改那么多,于是乎我拿出来了一个很短的解决方案:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        node.val = node.next.val
        node.next = node.next.next

这种方法,最快速度是44ms,最慢是76ms,这就更让我感到困惑了……

你可能感兴趣的:(leetcode,链表,leetcode)