题目描述

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。

现有一个链表 — head = [4,5,1,9],它可以表示为:

11、删除链表中的节点 - 图1

示例 1:
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

提示:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 无法直接获取被删除节点的上一节点
  • 将被删除节点的值改为其下一节点的值
  • 删除其下一节点

代码实现

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} node
  10. * @return {void} Do not return anything, modify node in-place instead.
  11. */
  12. var deleteNode = function (node) {
  13. node.val = node.next.val
  14. node.next = ndoe.next.next
  15. };

由于没有循环、数组、矩阵等操作,其时间复杂度和空间复杂度都是O(1)

删除尾节点

上面的删除是针对非末尾节点的删除操作,阉割版
下面是完全版的删除节点操作

【题目】https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} val
  11. * @return {ListNode}
  12. */
  13. var deleteNode = function (head, val) {
  14. let p = head
  15. let slowp = null
  16. while (p) {
  17. // console.log(p.val, slowp)
  18. if (p.val === val) {
  19. if (p.next) {
  20. // console.log('p.next有的:', p)
  21. p.val = p.next.val
  22. p.next = p.next.next
  23. } else {
  24. // console.log('p.next为空:', p)
  25. p = slowp
  26. p.next = null
  27. // console.log(p, head)
  28. }
  29. }
  30. if (p) {
  31. slowp = p
  32. p = p.next
  33. }
  34. }
  35. return head
  36. };