题目:
给定单向链表的头指针和一个节点指针,定义一个函数在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;
}