数据结构与算法之 leetcode 链表删除重复节点 有序链表去重

数据结构与算法阿木 发布于 5 天前 2 次阅读


链表删除重复节点(有序链表去重)——LeetCode算法挑战

链表是数据结构中的一种,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在LeetCode等编程竞赛平台中,链表操作是一个常见的题目类型。本文将围绕“链表删除重复节点”这一主题,探讨有序链表去重的算法实现。

在有序链表中,重复的节点通常出现在相邻的位置。删除重复节点可以通过遍历链表,比较当前节点与其下一个节点来实现。本文将详细介绍这一问题的背景、解决方案以及代码实现。

问题分析

假设我们有一个有序链表,链表中的节点按照升序排列。我们的目标是删除链表中的所有重复节点,使得链表中只保留唯一的节点。

输入

- 一个有序链表的头节点 `head`。

输出

- 删除重复节点后的链表的头节点。

示例

输入:`1 -> 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5`

输出:`1 -> 2 -> 3 -> 4 -> 5`

解决方案

思路

1. 初始化一个指针 `current` 指向链表的头节点。

2. 遍历链表,对于每个节点,比较其值与其下一个节点的值。

3. 如果当前节点与其下一个节点的值相同,则删除下一个节点。

4. 如果当前节点与其下一个节点的值不同,则将 `current` 指针移动到下一个节点。

5. 重复步骤 2-4,直到到达链表的末尾。

代码实现

以下是使用Python语言实现的代码示例:

python

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

def delete_duplicates(head):


if not head or not head.next:


return head

current = head


while current and current.next:


if current.val == current.next.val:


current.next = current.next.next


else:


current = current.next

return head

测试代码


def print_list(node):


while node:


print(node.val, end=" -> ")


node = node.next


print("None")

创建链表


head = ListNode(1, ListNode(1, ListNode(2, ListNode(3, ListNode(3, ListNode(4, ListNode(4, ListNode(5))))))))

删除重复节点


head = delete_duplicates(head)

打印结果


print_list(head)


复杂度分析

- 时间复杂度:O(n),其中 n 是链表的长度。我们需要遍历整个链表一次。

- 空间复杂度:O(1),我们只需要常数级别的额外空间来存储指针。

总结

本文介绍了有序链表删除重复节点的算法实现。通过比较相邻节点,我们可以有效地删除重复的节点,从而得到一个只包含唯一节点的链表。这个算法的时间复杂度和空间复杂度都是高效的,适用于处理大规模的链表数据。

在实际应用中,链表操作是编程中常见的技术,熟练掌握链表操作对于提高编程能力具有重要意义。希望本文能够帮助读者更好地理解和掌握链表删除重复节点的算法。