Python编程题45--移除链表元素
题目
给定一个链表的头节点 head 和一个整数 val ,请删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
例如:
原链表转换为列表:[1, 2, 6, 3, 4, 5, 6],要删除的链表元素 val = 6
最终的链表转换为列表:[1, 2, 3, 4, 5]原链表转换为列表:[],要删除的链表元素 val = 1
最终的链表转换为列表:[]原链表转换为列表:[7, 7, 7, 7],要删除的链表元素 val = 7
最终的链表转换为列表:[]
已知 链表节点的定义、链表与列表相互转换 的代码如下:
点我复制class ListNode: # 单链表
def __init__(self, val=0, next=None):
self.val = val # 链表节点上存储的元素
self.next = next # 指向下一个链表节点
def list_to_list_node(numbers): # 将列表转换为单向链表,并返回链表的头节点
dummy_head = ListNode(0)
pre = dummy_head
for number in numbers:
pre.next = ListNode(number)
pre = pre.next
pre = dummy_head.next
return pre
def list_node_to_list(node): # 将单向链表转换为列表
result = []
while node:
result.append(node.val)
node = node.next
return result
实现思路1
- 设置一个虚拟头节点
dummy_head
,然后再进行链表节点的删除 - 对链表节点进行遍历,如果下一个节点符合条件,那么就让则让下一个节点向后移动一位,也就是让下一个节点的
next
指向下个节点的下个节点,同时注意此时不能让当前节点cur
向后移动,因为 下个节点的下个节点cur.next.next
很可能也符合条件,所以需继续循环 - 如果下一个节点不满足条件时,那么才让当前节点向后移动一位
- 最后返回头节点时,需要注意新的头节点是 dummy_head 的下一个节点,即
dummy_head.next
代码实现1
点我复制def removeElements(head: ListNode, val: int) -> ListNode:
dummy_head = ListNode(next=head) # 设置一个虚拟头节点
cur = dummy_head
while cur.next is not None:
if cur.next.val == val: # 如果满足条件,则让下一个节点指向下下个节点
cur.next = cur.next.next
else:
cur = cur.next
new_head = dummy_head.next # 新的头节点为虚拟头节点的下一个节点
return new_head
实现思路2
- 不设置虚拟头节点,直接用原链表进行节点的删除
- 对于符合条件的节点,在删除节点的时候,这里需区分头节点和非头节点的情况,二者的处理方式不一样
- 首先需要处理符合条件的链表头节点,如果链表头节点符合条件,那么直接让头节点向后移动一位,循环该操作,直到其不再满足条件
- 接着处理非头节点的情况,如果下一个节点符合条件,那么就让则让下一个节点向后移动一位,也就是让下一个节点的
next
指向下个节点的下个节点,同时注意此时不能让当前节点cur
向后移动,因为 下个节点的下个节点cur.next.next
很可能也符合条件,所以需继续循环 - 最后在下一个节点不满足条件时,那么才让当前节点向后移动一位
代码实现2
点我复制def removeElements(head: ListNode, val: int) -> ListNode:
while head is not None and head.val == val: # 删除符合条件的所有头节点
head = head.next
cur = head
while cur is not None and cur.next is not None: # 删除符合条件的所有其他节点
if cur.next.val == val: # 如果满足条件,则让下一个节点指向下下个节点
cur.next = cur.next.next
else:
cur = cur.next
return head
更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)
作者:wintest
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)