【算法训练】剑指offer#18 删除链表的节点
一、描述
删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
二、思路
- 按顺序遍历链表,找到与删除值相等节点时,修改指向,应该就可以了
def deleteNode(self, head: ListNode, val: int) -> ListNode:
if head is None:
pass
else:
NextNode = head.next
LastNode = head
while NextNode.next: # 当存在下一个节点时,循环
if NextNode.val == val:
LastNode.next = NextNode.next
break
LastNode = NextNode
NextNode = NextNode.next
return head
没有考虑头节点是否需要删除
- 增加isFirst变量判断是否是头节点需要删除
增加后发现还没有判断尾节点
if NextNode.val == val:
LastNode.next = None
可是将其加到while外面后,就会仅仅保留删除节点前的链表,应该判断一下当前是否为最后一个节点,判断方法就是看是否是通过break跳出的循环
if NextNode.val == val and isBreak is not True:
LastNode.next = None
三、解题
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
if head is None:
pass
else:
NextNode = head
LastNode = None
isFirst = True
isBreak = False
while NextNode.next: # 当存在下一个节点时,循环
if NextNode.val == val:
if isFirst:
head = NextNode.next
else:
LastNode.next = NextNode.next
isBreak = True
break
isFirst = False
LastNode = NextNode
NextNode = NextNode.next
if NextNode.val == val and isBreak is not True:
LastNode.next = None
return head