力扣 初级算法 全套力扣精解

初级算法-链表-删除链表中的节点

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.
条件分析:
  1. 删除链表中给定的非末尾节点 -> 链表的 next 肯定是存在的
  2. 传入函数的唯一参数为要被删除的节点 -> 传入的节点就是要被删除的,并且节点是唯一的
  3. 链表至少两个节点 -> 链表是非空的
  4. 链表所有节点的值都是唯一的 -> 传入的节点肯定是唯一的
  5. 给定的节点为非末尾节点并且一定是链表中的一个有效节点 -> 节点有效且非末尾
  6. 不要从你的函数中返回任何结果 -> 不用返回,直接操作链表即可
解决思路1:
  1. 根据分析1、5,可以直接取到该节点的next
  2. 根据分析2、4,说明可以直接操作该删除的节点,不会出现重复
  3. 根据根系3, 说明可以不考虑空链表情况
  4. 根据分析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)

考察要点:

上一篇下一篇

猜你喜欢

热点阅读