返回
算法刷题宝典:LeetCode剑指offer专题之18. 删除链表的节点
前端
2023-10-10 14:57:36
前言
算法和数据结构是计算机科学的基础,也是程序员必备的技能。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专题中的算法题目涵盖了算法和数据结构的各个方面,对于初学者来说是一个非常好的学习资源。通过持续练习和深入理解,我们可以不断提升自己的算法技能,为职业发展和个人成长奠定坚实的基础。