初级算法-链表-删除链表中的节点
2021-08-25 本文已影响0人
coenen
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为要被删除的节点 。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
链表.png
提示:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
摘一个示例做个说明.
示例 1:
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
条件分析:
- 删除链表中给定的非末尾节点 -> 链表的 next 肯定是存在的
- 传入函数的唯一参数为要被删除的节点 -> 传入的节点就是要被删除的,并且节点是唯一的
- 链表至少两个节点 -> 链表是非空的
- 链表所有节点的值都是唯一的 -> 传入的节点肯定是唯一的
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点 -> 节点有效且非末尾
- 不要从你的函数中返回任何结果 -> 不用返回,直接操作链表即可
解决思路1:
- 根据分析1、5,可以直接取到该节点的next
- 根据分析2、4,说明可以直接操作该删除的节点,不会出现重复
- 根据根系3, 说明可以不考虑空链表情况
- 根据分析6,说明可以直接操作节点,只需要保证链表是正确的即可
可以直接取到该节点的next节点,然后删除节点的val为next的val,删除节点的next为next的next即可.
func deleteNode(_ node: ListNode?) {
node?.val = (node?.next!.val)!
node?.next = node?.next!.next
}
测试用例:
let endNode = ListNode.init(0)
let fourNode = ListNode.init(1)
fourNode.next = endNode
let threeNode = ListNode.init(2)
threeNode.next = fourNode
let secondNode = ListNode.init(2)
secondNode.next = threeNode
let firstNode = ListNode.init(1)
firstNode.next = secondNode
let headNode = ListNode.init(0)
headNode.next = firstNode
deleteNode(secondNode)
考察要点:
- 链表