返回
勇敢踏上刷题征程,逐个击破 leetcode 83:删除链表重复元素
前端
2023-11-16 23:08:15
踏上刷题征程
在浩瀚的编程题海中,leetcode 83 是一颗璀璨的明珠,它不仅考察了算法和数据结构的基础知识,更锻炼了我们解决问题的能力。题目要求我们删除一个排序链表中所有重复的元素,乍一看似乎并不复杂,但实际操作起来却暗藏玄机。
链表的奥秘
链表是一种常见的数据结构,它由一个个节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。链表的优势在于它的动态性,可以灵活地插入或删除节点,而无需移动整个数组。
算法的策略
删除链表中的重复元素,我们可以采取以下策略:
- 使用哈希表: 将链表中的元素存储到哈希表中,如果元素已存在,则跳过该元素。
- 使用双指针: 使用两个指针,一个指针指向当前节点,另一个指针指向下一个节点。如果当前节点与下一个节点相等,则删除下一个节点。
代码实现
根据以上策略,我们可以用以下代码实现:
def delete_duplicates(head):
if not head or not head.next:
return head
current = head
while current.next:
if current.val == current.next.val:
current.next = current.next.next
else:
current = current.next
return head
代码解析
- 边界条件检查: 首先检查链表是否为空或只有一个元素,如果是,则直接返回链表。
- 双指针遍历: 使用两个指针,
current
和current.next
,遍历链表。 - 比较节点值: 如果当前节点与下一个节点的值相等,则删除下一个节点。
- 移动指针: 如果当前节点与下一个节点的值不相等,则移动
current
指针到下一个节点。
应用实例
# 创建一个示例链表
head = ListNode(1)
head.next = ListNode(1)
head.next.next = ListNode(2)
head.next.next.next = ListNode(3)
head.next.next.next.next = ListNode(3)
# 删除重复元素
new_head = delete_duplicates(head)
# 遍历并打印删除后的链表
current = new_head
while current:
print(current.val, end=" ")
current = current.next
输出结果:
1 2 3
总结
通过对 leetcode 83 的深入剖析,我们不仅掌握了删除排序链表中重复元素的算法,更提升了我们对链表数据结构和算法策略的理解。在刷题的道路上,我们应该勇往直前,不断挑战自己,在一次次的解题中积累经验,提升能力。leetcode 83 只是我们刷题征程中的一块垫脚石,让我们继续前行,征服更多难题,成为一名出色的程序员!