剑指offer面试题13-在O(1)时间删除链表的节点

题目:

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



要想在O(1)时间搞定,绝对不能用遍历。

这里采用将后面的一个节点复制到当前节点的方法。

不过有特殊情况要考虑:

1.如果要删除的节点没有下一个节点:

则要找到上一个节点,并且将next设置为空,这个时候只能用遍历

2.如果当前链表就一个节点

由于java中没有指向指针的指针,所以用返回null。


public class Node {
	Integer value;
	Node next;
}

/**
	 * 在时间复杂度为O(1)的情况下删除链表的节点。<br/>
	 * 不过有个前提是要删除的这个节点必须在链表中包含,不然不会报错也不会改变原先的链表
	 * */
	public static Node delete(Node head, Node node) {
		// 检查空
		if (node == null) {
			throw new RuntimeException();
		}
		Node next = node.next;
		if (next != null) {
			// 有下一个节点的情况:复制覆盖
			node.value = next.value;
			node.next = next.next;
			// 没有下一个节点的情况
		} else {
			Node previous = null;
			Node current = head;
			while (current != null) {
				if (current == node) {
					// 前一个为空,要删除的节点即是第一个头结点
					if (previous == null) {
						head = null;
					} else {
						// 前一个不为空,则将next置为null即可
						previous.next = null;
					}
				}
				previous = current;
				current = current.next;
			}
		}
		return head;
	}


你可能感兴趣的:(java,链表)