0 题目描述
leetcode原题链接:剑指 Offer 18. 删除链表的节点
1 双指针解法
删除值为 val 的节点分需为两步:定位节点、修改引用。
- 定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。
- 修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
if not head: return head
if head.val == val:
return head.next
pre, cur = head.next, head
while pre:
if pre.val == val:
cur.next = pre.next
return head
pre, cur = pre.next, cur.next
return head
复杂度分析
时间复杂度
O
(
N
)
O(N)
O(N) :
N
N
N为链表长度,删除操作平均需循环
N
/
2
N/2
N/2 次,最差
N
N
N 次。
空间复杂度
O
(
1
)
O(1)
O(1) : cur, pre 占用常数大小额外空间。