Leetcode203、206(链表篇)

链表操作的时间复杂度

Access O(n) 要从头遍历到位

Search O(n) 同上

Delete O(1) 只需要断掉指针就行了 仅仅指删除这个操作

Insert O(1) 同上 修改指针指向即可

特点: 读少写多

Python链表中的常用操作

创建链表

linkedlist = deque()

添加元素(加在末尾)

linkedlist.append(1)

在某一位置添加指定的元素

linkedlist.insert(2, 99) 在索引为二的位置上插入99的元素 实现这个函数的时间复杂度为O(n)

访问元素

element = linkedlist[2] 访问index为2的值 O(n)

搜索元素

index = linkedlist.index(99) 搜索值为99的index

更新元素

linkedlist[2] = 88 时间复杂度也是O(n)

删除元素

linkedlist.remove(88) 删除88这个数 O(n)

删除指定索引上的值

del linkedlist[2] O(n)



 第一次没写出来 没写过这种题

看的视频讲解代码为:

class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        prev = dummy
        while head is not None:
            if head.val == val :
                prev.next = head.next
            else:
                prev = prev.next
            head = head.next
        return dummy.next

具体思路为:首先在整个链表的最前端设置一个dummy节点 也可以叫虚拟节点 同时将dummy复制给preview节点  然后dummy(preview)的后一个节点就是head dummy是一直不动的 preview节点则一直表示head的前一个节点 如果要删除 head.val = val 的值 就需要将prev.next指向head.next 

如果不是目标值则只将head往后移一位 就是 prev = prev.next head = head.next 最后return dummy.next  就是返回改变后的链表

在评论区看到一个更好理解的代码 答题思路一样

class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        dummy_head = ListNode(next=head) #添加一个虚拟节点
        cur = dummy_head
        while(cur.next!=None):
            if(cur.next.val == val):
                cur.next = cur.next.next #删除cur.next节点
            else:
                cur = cur.next
        return dummy_head.next

这里的cur 同 prev 关键点就在于 删除cur.next节点的操作为 cur.next = cur.next.next

如果非目标值 只需要往后移一位的操作为 cur = cur.next  这样更好记忆理解



206

 本题同样是设置一个dummy节点 

我犯的错误在于 head是一直在移动的 2到1的指针 应该是指向dummy.next 而不是head

ok 从头到尾操作一遍  首先 设置两个变量 dnext = dummy.next 就是dummy的后面一个节点

                                                                  hnext  = head.next 就是head后面的一个节点

然后开始改指针 首先 dummy指向2: 操作为 dummy.next = hnext

然后将1指向3 :操作为 head.next = hnext.next

然后将2指向1:操作为hnext.next  = dnext  然后循环 依次将3 4 5 往前移

重要的理解!!!!: head.next可以理解为从head出发的指针  = 后面接上的是指针指向的位置

这样 上一题就也很好理解了 prev.next = head.next  就是从prev出发的指针 直接指向head.next(head后面的一个节点) 因为没有指向head 所以head这个值被删掉了

然后 head = head.next 就代表head往后移一位

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyttonkeepgoing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值