当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

给定单向链表的头指针和一个节点指针,定义一个函数在 O(1) 时间内删除该节点。

解法

判断要删除的节点是否是尾节点,若是,直接删除;若不是,把要删除节点的下一个节点赋给要删除的节点即可。

进行n次操作,平均时间复杂度为:( (n-1) * O(1) + O(n) ) / n = O(1),所以符合题目上说的O(1)

  1. /**
  2. * @author bingo
  3. * @since 2018/11/20
  4. */
  5. public class Solution {
  6. class ListNode {
  7. int val;
  8. ListNode next;
  9. }
  10. /**
  11. * 删除链表的节点
  12. * @param head 链表头节点
  13. * @param tobeDelete 要删除的节点
  14. */
  15. public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
  16. if (head == null || tobeDelete == null) {
  17. return head;
  18. }
  19. // 删除的不是尾节点
  20. if (tobeDelete.next != null) {
  21. tobeDelete.val = tobeDelete.next.val;
  22. tobeDelete.next = tobeDelete.next.next;
  23. }
  24. // 链表中仅有一个节点
  25. else if (head == tobeDelete) {
  26. head = null;
  27. }
  28. // 删除的是尾节点
  29. else {
  30. ListNode ptr = head;
  31. while (ptr.next != tobeDelete) {
  32. ptr = ptr.next;
  33. }
  34. ptr.next = null;
  35. }
  36. return head;
  37. }
  38. }

测试用例

  1. 功能测试(从有多个节点的链表的中间/头部/尾部删除一个节点;从只有一个节点的链表中删除唯一的节点);
  2. 特殊输入测试(指向链表头节点的为空指针;指向要删除节点的为空指针)。

该分类下的相关小册推荐: