如何在O(1)时间删除链表指定节点(Java实现)
2017-07-10 23:25
323 查看
声明:题目背景为剑指offer-13 在O(1)时间删除链表节点
给出一个链表如下:
删除链表中给定节点,我想最容易想到的方法就是循环遍历,假设想删除节点toBeDeleted,我们先遍历链表,找到节点的下一节点为toBeDeleted的节点,将其指向toBeDeleted节点的下一节点即可保证安全的删除链表且无断开。示意图如下:
但是这种方法的复杂度O(n),在O(1)时间删除指定节点,书中指出将下一个节点的内容复制到需要删除的节点上面覆盖原有内容,再删除下一个节点即相当于删除了原节点,如下图:
这里需要注意考虑以下几种情况:
1.链表和待删除节点均不为空
2.链表中只有一个节点时
3.待删除节点为尾节点时
4.链表中多个点,待删除节点不为尾节点
帅气的方法,所以自己也用Java实现了一下。方法实现代码如下:
给出一个链表如下:
删除链表中给定节点,我想最容易想到的方法就是循环遍历,假设想删除节点toBeDeleted,我们先遍历链表,找到节点的下一节点为toBeDeleted的节点,将其指向toBeDeleted节点的下一节点即可保证安全的删除链表且无断开。示意图如下:
但是这种方法的复杂度O(n),在O(1)时间删除指定节点,书中指出将下一个节点的内容复制到需要删除的节点上面覆盖原有内容,再删除下一个节点即相当于删除了原节点,如下图:
这里需要注意考虑以下几种情况:
1.链表和待删除节点均不为空
2.链表中只有一个节点时
3.待删除节点为尾节点时
4.链表中多个点,待删除节点不为尾节点
帅气的方法,所以自己也用Java实现了一下。方法实现代码如下:
/** * 在O(1)时间内删除指定节点,思路:找到指定节点的下一节点,覆盖指定节点 * 考虑:1.链表和待删除节点均不为空 * 2.链表中只有一个节点时-->头结点等于尾节点 * 3.待删除节点为尾节点时-->待删除节点不存在下一个节点--> * 只有循环遍历 * 4.链表中多个点,待删除节点不为尾节点 * @param listNode * @param toBeDeleted */ public void deleteNode(ListNode listNode, ListNode toBeDeleted){ //输入的链表及待删节点不能为空 if(listNode == null || toBeDeleted == null) return; if(listNode == toBeDeleted){ listNode = null; }else if(toBeDeleted.next != null){ ListNode nextNode = toBeDeleted.next; toBeDeleted.val = nextNode.val; toBeDeleted.next = nextNode.next; }else{ while(listNode.next != toBeDeleted){ listNode = listNode.next; } listNode.next = null; } }
相关文章推荐
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
- 在O(1)时间删除链表节点(Java实现)
- 剑指Offer(java版):在O(1)时间删除链表节点
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现
- 372. 在O(1)时间复杂度删除链表节点--java
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- 在带头节点的单链表中,删除所有值为x的节点(Java实现)
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- java实现链表指定值得删除,查找第二部分代码
- 0(1)时间删除带头节点单链表指定节点。
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- 数据结构与算法分析笔记与总结(java实现)--链表14:删除链表中所有指定值结点问题
- 单链表中实现O(1)时间复杂度删除节点
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 单链表的java语言完整实现含添加删除节点
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- 删除链表中指定节点,要求时间复杂度为O(1)
- 算法面试之道:在O(1)的时间内删除单链接链表的指定节点