灵感来源
- 保持更新,努力学习
- python脚本学习
删除排序链表中的重复元素
解题思路
本题要求删除排序链表中的重复元素,由于链表是有序的,所以重复的元素在链表中是连续出现的。我们可以通过遍历链表,比较当前节点的值和下一个节点的值,如果相等就跳过下一个节点,直到找到不相等的节点,然后将当前节点的next
指针指向这个不相等的节点。
以下是具体步骤:
- 判断链表是否为空:如果链表为空,直接返回
None
。 - 遍历链表:使用一个指针
current
从链表的头节点开始遍历。 - 比较相邻节点的值:在遍历过程中,比较
current
节点的值和current.next
节点的值。如果相等,说明是重复元素,将current.next
指向current.next.next
,跳过重复节点;如果不相等,将current
指针移动到current.next
。 - 返回头节点:遍历结束后,返回链表的头节点。
# 定义链表节点类 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def deleteDuplicates(head): # 如果链表为空,直接返回 None if not head: return None # 初始化当前节点为头节点 current = head while current.next: if current.val == current.next.val: # 如果当前节点的值和下一个节点的值相等,跳过下一个节点 current.next = current.next.next else: # 如果不相等,移动到下一个节点 current = current.next return head # 辅助函数:将列表转换为链表 def list_to_linked_list(lst): dummy = ListNode(0) current = dummy for val in lst: current.next = ListNode(val) current = current.next return dummy.next # 辅助函数:将链表转换为列表 def linked_list_to_list(head): result = [] current = head while current: result.append(current.val) current = current.next return result # 测试代码 input_list = [1, 1, 2, 3, 3] head = list_to_linked_list(input_list) new_head = deleteDuplicates(head) output_list = linked_list_to_list(new_head) print(output_list)
逐行解释
# 定义链表节点类,每个节点包含一个值和一个指向下一个节点的指针
class ListNode:
def __init__(self, val=0, next=None):
# 节点的值
self.val = val
# 指向下一个节点的指针
self.next = next
def deleteDuplicates(head):
# 如果链表为空,直接返回 None
if not head:
return None
# 初始化当前节点为头节点,用于遍历链表
current = head
# 当当前节点有下一个节点时,继续遍历
while current.next:
# 如果当前节点的值和下一个节点的值相等
if current.val == current.next.val:
# 跳过下一个节点,将当前节点的 next 指针指向下下个节点
current.next = current.next.next
else:
# 如果不相等,将当前节点移动到下一个节点
current = current.next
# 遍历结束后,返回链表的头节点
return head
# 辅助函数:将列表转换为链表
def list_to_linked_list(lst):
# 创建一个虚拟头节点,方便操作
dummy = ListNode(0)
# 初始化当前节点为虚拟头节点
current = dummy
# 遍历列表中的每个元素
for val in lst:
# 创建一个新节点,值为当前元素
current.next = ListNode(val)
# 将当前节点移动到新节点
current = current.next
# 返回虚拟头节点的下一个节点,即链表的头节点
return dummy.next
# 辅助函数:将链表转换为列表
def linked_list_to_list(head):
# 用于存储链表元素的列表
result = []
# 初始化当前节点为链表的头节点
current = head
# 当当前节点不为空时,继续遍历
while current:
# 将当前节点的值添加到结果列表中
result.append(current.val)
# 将当前节点移动到下一个节点
current = current.next
# 返回结果列表
return result
# 测试代码
# 定义一个包含重复元素的列表
input_list = [1, 1, 2, 3, 3]
# 将列表转换为链表
head = list_to_linked_list(input_list)
# 调用 deleteDuplicates 函数删除重复元素
new_head = deleteDuplicates(head)
# 将处理后的链表转换为列表
output_list = linked_list_to_list(new_head)
# 打印处理后的列表
print(output_list)