算法题 单链表O(1)时间删除给定节点

今天听说能用O(1)删除链表节点,惊了,赶紧查了下怎么回事。

http://www.cnblogs.com/bakari/p/4013812.html

题目是这样的:给定头节点和目标节点,删除目标节点。

public void deleteInO1(Node head,Node t){
    //TODO
}

以往我们都是遍历一遍链表找到目标节点的前驱节点,然后指来指去解决。

今天,学了一招叫做“狸猫换太子”。

当删除节点不是尾节点时,将t.next指向t.next.next,并且把t.next.val赋值给t。

打个比方,1->2->3->4->null; 我们要删除2,将2的next指向4,3的值赋值给2,就能实现1->3->4->null

当删除节点为尾节点时,就像我们以往做的那样,遍历找前驱,然后把前驱的next等于空。

平均的时间复杂度为:(O(1) * (n-1) + O(n))/n = O(1);仍然为O(1).

publi void deleteInO1(Node head,Node t){
    if (head == null || t == null)
        return;   
    if (t.next != NULL) { 
        Node tmp = t.next;
        t.next = tmp.next;
        t.val = tmp.val;
    }
    else { //待删除节点为尾节点
        Node tmp = head;
        while(tmp.next != t) 
            tmp = tmp.next;
        tmp.next = NULL;
    }
}

但是这个方法只适用于把指定的节点给你的情况,比较特殊。


问题:如果是尾节点的话为什么不直接t=null呢?

又犯了参数传递的老问题。传进来的是对象的引用的Copy,就算将t=null,也不会改变方法外的链表。

像这样:

如果把t'指向null,t是不会改变的。


关于Java参数传递

https://www.cnblogs.com/Scort/p/5210792.html


猜你喜欢

转载自blog.csdn.net/qq_35546040/article/details/80341136
今日推荐