返回

算法刷题宝典:LeetCode剑指offer专题之18. 删除链表的节点

前端

前言

算法和数据结构是计算机科学的基础,也是程序员必备的技能。LeetCode是一个广受认可的在线算法练习平台,其剑指offer专题包含了众多经典算法问题,对于初学者来说是一个非常好的学习资源。本文将带领读者深入探讨LeetCode剑指offer专题中的第18题“删除链表的节点”,帮助大家掌握链表删除节点这一重要算法技巧。

题目

给定一个单链表的头节点head和一个要删除的节点delNode,请设计一个算法删除该节点。

解题思路

链表是一个线性数据结构,由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。删除链表中的一个节点需要考虑以下几种情况:

  • 要删除的节点是头节点
  • 要删除的节点是尾节点
  • 要删除的节点位于链表中间

对于第一种情况,直接更新头节点即可。对于第二种情况,需要遍历链表找到尾节点的前一个节点,并更新其指向。对于第三种情况,需要遍历链表找到要删除的节点的前一个节点,并更新其指向,跳过要删除的节点。

具体实现

def deleteNode(head, delNode):
    if not head or not delNode:
        return head

    # 要删除的节点是头节点
    if head == delNode:
        return head.next

    # 找到要删除的节点的前一个节点
    prev = None
    current = head
    while current != delNode:
        prev = current
        current = current.next

    # 要删除的节点是尾节点
    if not current:
        return head

    # 更新前一个节点的指向,跳过要删除的节点
    prev.next = current.next

    # 返回新的头节点
    return head

代码示例

# 创建一个链表
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)

# 要删除的节点
delNode = head.next.next

# 删除节点
newHead = deleteNode(head, delNode)

# 打印新链表
current = newHead
while current:
    print(current.val)
    current = current.next

输出结果

1
2
4
5

总结

链表删除节点是一个常见的算法问题,需要考虑多种情况。通过理解链表的特性和删除节点的逻辑,我们可以轻松实现删除链表节点的算法。LeetCode剑指offer专题中的算法题目涵盖了算法和数据结构的各个方面,对于初学者来说是一个非常好的学习资源。通过持续练习和深入理解,我们可以不断提升自己的算法技能,为职业发展和个人成长奠定坚实的基础。