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

数据结构与算法阿木 发布于 2025-07-12 13 次阅读


摘要:

链表是数据结构中常见的一种,其在计算机科学中有着广泛的应用。在LeetCode等编程竞赛平台中,链表问题也是高频考点之一。本文将围绕LeetCode中的“删除重复节点”问题,深入探讨有序链表处理的相关算法,并从代码实现、时间复杂度、空间复杂度等方面进行分析。

一、问题背景

在有序链表中,删除重复节点是一个基础且常见的问题。给定一个有序链表,删除所有重复的元素,使得每个元素只出现一次。例如,对于链表1->2->3->3->4->4->5,删除重复节点后,链表变为1->2->3->4->5。

二、算法思路

1. 遍历链表,比较当前节点与下一个节点的值。

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

3. 如果当前节点与下一个节点的值不同,则将当前节点指向下一个节点。

4. 重复步骤1-3,直到遍历完整个链表。

三、代码实现

以下是用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

cur = head


while cur.next:


if cur.val == cur.next.val:


cur.next = cur.next.next


else:


cur = cur.next


return head

测试代码


def print_list(head):


while head:


print(head.val, end=' ')


head = head.next


print()

创建链表


head = ListNode(1)


head.next = ListNode(2)


head.next.next = ListNode(3)


head.next.next.next = ListNode(3)


head.next.next.next.next = ListNode(4)


head.next.next.next.next.next = ListNode(4)


head.next.next.next.next.next.next = ListNode(5)

删除重复节点


head = delete_duplicates(head)

打印结果


print_list(head)


四、时间复杂度与空间复杂度分析

1. 时间复杂度:该算法的时间复杂度为O(n),其中n为链表的长度。因为我们需要遍历整个链表一次,比较相邻节点的值。

2. 空间复杂度:该算法的空间复杂度为O(1),因为我们只需要常数级别的额外空间来存储当前节点和下一个节点的引用。

五、总结

本文深入解析了LeetCode中的“删除重复节点”问题,针对有序链表处理,给出了相应的算法思路和代码实现。通过分析时间复杂度和空间复杂度,我们可以了解到该算法的效率。在实际应用中,我们可以根据具体需求选择合适的算法来处理链表问题。