今天听说能用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