【算法训练】剑指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


posted @ 2022-01-18 17:53  小拳头呀  阅读(25)  评论(0编辑  收藏  举报