题解 | #从单向链表中删除指定值的节点#
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
参考解题区大佬的答案,在那基础上修改出来
这是我第一次理解了链表的构建,耗了一个下午,真的是想吐了~~
- 个人感觉难点在【链表的构建】和【题目啥意思的分析】
- 改进了一下,原大佬在【删除节点】操作中,没有考虑到【需要删除的节点为头节点】时该如何处理,
- 所以在执行用例的时候,【需要删除的节点为头节点】的自测用例,会报错
- 也修改了一下【链表插入构建】的书写习惯
大佬原码:
class ListNode: def __init__(self, val): self.val = val self.next = None # 根据题意在node链表中插入节点 def insert(node, val1, val2): """ node:待操作链表 val1:第一个节点值 val2:第二个节点值 return:操作后的链表node """ gummy = node while gummy: next = gummy.next if gummy.val == val2: gummy.next = ListNode(val1) gummy.next.next = next break else: gummy = gummy.next return node while True: try: lis = list(map(int, input().split())) # 插入节点 head = ListNode(lis[1]) new_lis = lis[2:len(lis)-1] result = [] left = 0 right = 1 while right < len(new_lis): head = insert(head, new_lis[left], new_lis[right]) left += 2 right += 2 dummy = head # 删除节点 while dummy: if dummy.next.val == lis[-1]: dummy.next = dummy.next.next break else: dummy = dummy.next # 打印节点值 while head: print(head.val,end=" ") head= head.next except EOFError: break我修改后的:
class ListNode: def __init__(self, val): self.val = val self.next = None # 根据题意在node链表中插入节点 def insert(node, val1, val2): """ node:待操作链表 val1:第一个节点值 val2:第二个节点值 return:操作后的链表node """ gummy = node while gummy: # 第一个修改点 # 个人习惯先创建一个节点,然后对这个新节点的next去赋值,之后再把前一个节点的next指向新节点 if gummy.val == val2: newNode = ListNode(val1) newNode.next = gummy.next gummy.next = newNode break else: gummy = gummy.next return node lis = list(map(int, input().split())) # 插入节点 head = ListNode(lis[1]) new_lis = lis[2:len(lis)-1] result = [] left = 0 right = 1 while right < len(new_lis): head = insert(head, new_lis[left], new_lis[right]) left += 2 right += 2 dummy = head # 删除节点 while dummy: # 第二个修改点 # 增加了【需要删除的节点是头节点】时的处理, # 就是把头节点的指针移动到下一个位置,然后就可以跳出循环了 if head.val == lis[-1]: head = head.next break elif dummy.next.val == lis[-1]: dummy.next = dummy.next.next break else: dummy = dummy.next # 打印节点值 while head: print(head.val,end=" ") head= head.next