链表操作的时间复杂度
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往后移一位