题目描述
给定单链表的头结点和待删除结点,在O(1)时间删除链表节点
class ListNode { int value; ListNode next; } /** * 常规方法从链表头结点沿着链表找到待删除结点完成删除操作。时间复杂度O(n) * 可以将待删除结点的下一结点内容复制到待删除结点上,将待删除结点的下一结点指向待删除结点的的下一结点的下一结点。 * 时间复杂度O(1) * @param head * @param toBeDeleted * @return */ public ListNode delete(ListNode head, ListNode toBeDeleted) { // 如果输入有空值,就返回头结点 if (head == null || toBeDeleted == null) return head; // 如果删除的是头结点,,返回头结点的下一结点 if (head == toBeDeleted) { return head.next; } // 如果待删除的是最后一个结点,从头结点顺序遍历到该节点的前序节点,再删除该节点。 if (toBeDeleted.next == null) { ListNode temp = head; while (temp.next != toBeDeleted) { temp = temp.next; } temp.next = null; } else { // 待删除结点在链表中间 // 待删除结点的下一结点的值覆盖待删除结点的值 toBeDeleted.value = toBeDeleted.next.value; // 待删除结点的下一结点指向待删除结点的的下一结点的下一结点。 toBeDeleted.next = toBeDeleted.next.next; } return head;