返回

勇敢踏上刷题征程,逐个击破 leetcode 83:删除链表重复元素

前端

踏上刷题征程

在浩瀚的编程题海中,leetcode 83 是一颗璀璨的明珠,它不仅考察了算法和数据结构的基础知识,更锻炼了我们解决问题的能力。题目要求我们删除一个排序链表中所有重复的元素,乍一看似乎并不复杂,但实际操作起来却暗藏玄机。

链表的奥秘

链表是一种常见的数据结构,它由一个个节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。链表的优势在于它的动态性,可以灵活地插入或删除节点,而无需移动整个数组。

算法的策略

删除链表中的重复元素,我们可以采取以下策略:

  1. 使用哈希表: 将链表中的元素存储到哈希表中,如果元素已存在,则跳过该元素。
  2. 使用双指针: 使用两个指针,一个指针指向当前节点,另一个指针指向下一个节点。如果当前节点与下一个节点相等,则删除下一个节点。

代码实现

根据以上策略,我们可以用以下代码实现:

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

代码解析

  1. 边界条件检查: 首先检查链表是否为空或只有一个元素,如果是,则直接返回链表。
  2. 双指针遍历: 使用两个指针,currentcurrent.next,遍历链表。
  3. 比较节点值: 如果当前节点与下一个节点的值相等,则删除下一个节点。
  4. 移动指针: 如果当前节点与下一个节点的值不相等,则移动 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 只是我们刷题征程中的一块垫脚石,让我们继续前行,征服更多难题,成为一名出色的程序员!