当前位置:   article > 正文

删除排序链表中的重复元素 II(LeetCode)

删除排序链表中的重复元素 II(LeetCode)

题目

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

解题

  1. class ListNode:
  2. def __init__(self, val=0, next=None):
  3. self.val = val
  4. self.next = next
  5. class Solution:
  6. def deleteDuplicates(self, head: ListNode) -> ListNode:
  7. # 创建一个虚拟头结点
  8. dummy = ListNode(0)
  9. dummy.next = head
  10. prev = dummy
  11. while head:
  12. # 检查当前节点是否是重复节点
  13. if head.next and head.val == head.next.val:
  14. # 找到所有重复的节点
  15. while head.next and head.val == head.next.val:
  16. head = head.next
  17. # 跳过所有重复的节点
  18. prev.next = head.next
  19. else:
  20. # 如果没有重复,更新 prev
  21. prev = prev.next
  22. # 移动到下一个节点
  23. head = head.next
  24. return dummy.next
  25. # 工具函数
  26. def print_linked_list(head: ListNode):
  27. """打印链表中的所有节点值"""
  28. current = head
  29. while current:
  30. print(current.val, end=" -> " if current.next else "\n")
  31. current = current.next
  32. def list_to_linked_list(values):
  33. """将列表转换为链表"""
  34. if not values:
  35. return None
  36. dummy = ListNode(0)
  37. current = dummy
  38. for value in values:
  39. current.next = ListNode(value)
  40. current = current.next
  41. return dummy.next
  42. def linked_list_to_list(head: ListNode):
  43. """将链表转换为列表"""
  44. result = []
  45. current = head
  46. while current:
  47. result.append(current.val)
  48. current = current.next
  49. return result
  50. # 测试代码
  51. if __name__ == "__main__":
  52. # 测试案例
  53. test_cases = [
  54. ([1, 1, 1, 2, 3], [2, 3]), # 删除重复元素后的链表
  55. ([1, 1, 2, 3, 3], [2]), # 删除重复元素后的链表
  56. ([1, 2, 3, 4, 5], [1, 2, 3, 4, 5]), # 无重复元素
  57. ([1, 1, 2, 2, 3, 3], []), # 所有元素都重复
  58. ([1, 2, 3, 4, 4, 5, 5], [1, 2, 3]) # 删除重复元素后的链表
  59. ]
  60. for i, (values, expected) in enumerate(test_cases):
  61. head = list_to_linked_list(values)
  62. solution = Solution()
  63. print(f"测试用例 {i + 1}: 原链表:", end="")
  64. print_linked_list(head)
  65. new_head = solution.deleteDuplicates(head)
  66. result = linked_list_to_list(new_head)
  67. print(f"删除重复元素后的链表:", end="")
  68. print_linked_list(new_head)
  69. assert result == expected, f"测试失败:期望 {expected}, 但得到 {result}"
  70. print("测试通过\n")

测试用例 1: 原链表:1 -> 1 -> 1 -> 2 -> 3
删除重复元素后的链表:2 -> 3
测试通过

测试用例 2: 原链表:1 -> 1 -> 2 -> 3 -> 3
删除重复元素后的链表:2
测试通过

测试用例 3: 原链表:1 -> 2 -> 3 -> 4 -> 5
删除重复元素后的链表:1 -> 2 -> 3 -> 4 -> 5
测试通过

测试用例 4: 原链表:1 -> 1 -> 2 -> 2 -> 3 -> 3
删除重复元素后的链表:测试通过

测试用例 5: 原链表:1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 5
删除重复元素后的链表:1 -> 2 -> 3
测试通过

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/940298
推荐阅读
相关标签
  

闽ICP备14008679号