给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。
样例
给定 1->2->3->4
,和节点 3
,删除 3 之后,链表应该变为 1->2->4
。
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param node: the node in the list should be deleted
* @return: nothing
*/
public void deleteNode(ListNode node) {
/*在链表中删除一个结点,通常做法是从链表的头结点开始,顺序查找要删除的结点,
找到之后再删除。由于需要顺序查找,时间复杂度为O(n)
我们从头结点开始查找是为了找到要删除的结点的前一个结点。
其实我们可以从给定的结点得到它的下一个结点。然后把下一个结点的val复制给需要删除的结点上覆盖原有的
容,再把要删除的结点指向下一个结点的下一个结点,再删除的是它的下一个结点
此时,时间复杂度为O(1)*/
// write your code here
ListNode node1= node.next;
node.val=node1.val;
node.next=node1.next;
}
}
虽然本题没有要求,但如果删除的结点位于链表的尾部,我们仍然需要从链表的头结点开始,顺序遍历得到给定结点的前结点完成删除操作。这个时候时间复杂度是O(n)。
但总体的时间复杂度仍然是没有问题的。假设链表总共有n个结点,我们的算法在n-1种情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n)。那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,仍然为O(1)。