声明:题目背景为剑指offer-13 在O(1)时间删除链表节点 给出一个链表如下: 删除链表中给定节点,我想最容易想到的方法就是循环遍历,假设想删除节点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; } }