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

思路
if head.next.val = val:
head.next = head.next.next
时间复杂度是:O(n)
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:def deleteNode(self, head: ListNode, val: int) -> ListNode:if head.val == val:return head.nextcur = headwhile cur:# print(cur.val)if cur.next.val == val:cur.next = cur.next.nextbreakelse:cur = cur.nextreturn head
改进一下,增加一个空节点
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:def deleteNode(self, head: ListNode, val: int) -> ListNode:if head.val == val:return head.nextnullptr = ListNode(0)nullptr.next = headwhile nullptr:# print(cur.val)if nullptr.next.val == val:nullptr.next = nullptr.next.nextbreakelse:nullptr = nullptr.nextreturn head
扩展
如何在O(1)的时间复杂度内删除链表中的某个节点?
删除节点i:
- 先把i的下一个节点j的内容复制到i;
- i的指针指向节点j的下一个节点
- 删除节点j。
至此,就完成删除操作。
如果位于链表尾部,没有下一个节点,仍然需要从链表节点开始顺序遍历。
如果只有一个节点,那么把链表的头节点设置为nullptr(Null pointer)。
