题目

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。

image.png

思路

if head.next.val = val:
head.next = head.next.next

时间复杂度是:O(n)

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def deleteNode(self, head: ListNode, val: int) -> ListNode:
  8. if head.val == val:
  9. return head.next
  10. cur = head
  11. while cur:
  12. # print(cur.val)
  13. if cur.next.val == val:
  14. cur.next = cur.next.next
  15. break
  16. else:
  17. cur = cur.next
  18. return head

改进一下,增加一个空节点

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def deleteNode(self, head: ListNode, val: int) -> ListNode:
  8. if head.val == val:
  9. return head.next
  10. nullptr = ListNode(0)
  11. nullptr.next = head
  12. while nullptr:
  13. # print(cur.val)
  14. if nullptr.next.val == val:
  15. nullptr.next = nullptr.next.next
  16. break
  17. else:
  18. nullptr = nullptr.next
  19. return head

扩展

如何在O(1)的时间复杂度内删除链表中的某个节点?

删除节点i:

  • 先把i的下一个节点j的内容复制到i;
  • i的指针指向节点j的下一个节点
  • 删除节点j。

至此,就完成删除操作。

如果位于链表尾部,没有下一个节点,仍然需要从链表节点开始顺序遍历。

如果只有一个节点,那么把链表的头节点设置为nullptr(Null pointer)。