剑指offer(14):在O(1)时间删除链表节点
2016-04-25 14:01
423 查看
题目描述:
给定单向链表的头指针head和一个节点指针p,定义一个函数在O(1)O(1)时间删除该节点p。
分析:
在单向链表中删除一个节点,最常规的是从链表的头结点开始遍历,找到需要删除的节点并删除,平均时间复杂度为O(n)O(n)。
推荐解法:
根据需要删除的节点指针p,可以找到p的下一个节点q,将q的值赋值给p后再将p的指针指向q,即用q覆盖p,则达到删除的目的。
如果链表中只有一个节点,在删除该节点后需要把链表的头结点置为null。如果需要删除的是尾节点,即p的下一个节点q为null,则还是需要顺序遍历链表,找到p的前序节点进行删除操作。对于n-1个非尾节点,O(1)O(1)时间内可以删除,如果是尾节点则为O(n)O(n),平均时间复杂度为[O(1)∗(n−1)+O(n)∗1]/n[O(1)*(n-1)+O(n)*1]/n,时间复杂度还是O(1)O(1)。符合要求。不过该方法并没有判断需要删除的节点是否在链表中,为达到时间复杂度为O(1)O(1)的要求,将判断节点是否存在的责任推给了该方法的调用者。
代码:
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社
给定单向链表的头指针head和一个节点指针p,定义一个函数在O(1)O(1)时间删除该节点p。
分析:
在单向链表中删除一个节点,最常规的是从链表的头结点开始遍历,找到需要删除的节点并删除,平均时间复杂度为O(n)O(n)。
推荐解法:
根据需要删除的节点指针p,可以找到p的下一个节点q,将q的值赋值给p后再将p的指针指向q,即用q覆盖p,则达到删除的目的。
如果链表中只有一个节点,在删除该节点后需要把链表的头结点置为null。如果需要删除的是尾节点,即p的下一个节点q为null,则还是需要顺序遍历链表,找到p的前序节点进行删除操作。对于n-1个非尾节点,O(1)O(1)时间内可以删除,如果是尾节点则为O(n)O(n),平均时间复杂度为[O(1)∗(n−1)+O(n)∗1]/n[O(1)*(n-1)+O(n)*1]/n,时间复杂度还是O(1)O(1)。符合要求。不过该方法并没有判断需要删除的节点是否在链表中,为达到时间复杂度为O(1)O(1)的要求,将判断节点是否存在的责任推给了该方法的调用者。
代码:
/** * 平均时间复杂度为O(1),删除链表节点 * @param head 头结点 * @param nodeToBeDeleted 待删除节点 */ public void deleteNode(ListNode head, ListNode nodeToBeDeleted) { if(head == null || nodeToBeDeleted == null) return; // 要删除的节点不是尾节点 O(1) if (nodeToBeDeleted.next != null) { nodeToBeDeleted.val = nodeToBeDeleted.next.val; nodeToBeDeleted.next = nodeToBeDeleted.next.next; } else if(head == nodeToBeDeleted) { // 要删除头节点,而且链表只有一个节点 O(1) nodeToBeDeleted = null; head = null; } else { ListNode tmp = head; // 要删除尾节点,而且链表有多个节点 O(n) while (tmp.next != nodeToBeDeleted) { tmp = tmp.next; } tmp.next = null; nodeToBeDeleted = null; } }
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社
相关文章推荐
- HTML 保留显示空格
- css奇技淫巧之—多列等高
- H5 页面适配所有 iPhone 和安卓机型的六个技巧
- js对象中什么是可枚举性(enumerable)?
- 前端搬运工:零基础的前端开发初学者应如何系统地学习?前端掌握技能的学习路线
- js中的hasOwnProperty和isPrototypeOf方法
- 剑指offer(13):打印1到最大的n位数
- css 使用变量
- Windows 10 和 Fedora 23 双系统安装问题集
- Gulp watch error Error: watch /home/react-mobile/stylus/ ENOSPC
- 关于开发React Native的注意事项
- 【JS】导出table到excel,同时兼容FF和IE
- 信息系统实践手记6-JS调用Flex的性能问题一例
- JSTL自定义标签
- js中let和var定义变量的区别
- jQuery与Ajax
- 前端之团队组建篇
- jQuery事件
- jQuery操作DOM元素
- jQuery表单选择器