题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
题目保证链表中节点的值互不相同
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
示例1
输入:{2,5,1,9},5 返回值:{2,1,9}
说明:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
示例2
输入:{2,5,1,9},1 返回值:{2,5,9}
说明:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9
题目解析
题目中给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点,并返回删除后的链表头节点,同时题目假设链表中所有节点的值互不相同。
将题目拆解后可以明确以下几点
链表是单向链表:意味着只能通过遍历来查找和删除节点,不能直接访问前驱节点。
节点值互不相同:因此每个值只对应一个节点,无需担心重复值的问题。
返回删除后的链表头节点:最终返回的链表需要保持结构完整且去除了指定值的节点。
解题思路
首先我们要找到值等于给定值的节点,然后将其从链表中移除。如果头节点就是需要删除的节点,则需要更新头节点指向。基本思路就是通过遍历链表来查找目标节点,并使用指针操作将其删除。
代码实现
object Solution {
fun deleteNode(pHead: ListNode?, value: Int): ListNode? {
if (pHead == null) return null
// 如果头节点就是要删除的节点
if (pHead.`val` == value) {
return pHead.next
}
var prev: ListNode? = pHead
var current = pHead.next
// 查找目标节点
while (current != null) {
if (current.`val` == value) {
// 删除目标节点
prev?.next = current.next
break
}
prev = current
current = current.next
}
return pHead
}
}
首先检查链表是否为空,如果是空链表直接返回 null
。如果头节点的值等于目标值,直接返回头节点的下一个节点,删除头节点。这里使用 prev
和 current
两个指针遍历链表,prev
用于跟踪目标节点的前一个节点,current
用于查找目标节点,找到目标节点后,通过调整 prev.next
指向 current.next
,将目标节点从链表中移除。删除完成后,返回原链表的头节点。