常规思路是遍历整个链表,找到当前节点的next与待删除节点相等的节点后,将当前节点的next指向待删除的节点的next,然后删除节点。时间复杂度为O(n)。
另一种思路,将待删除节点的值设置成他的下个节点值,指针也指向下个节点的next,是不是实际上也相当于去掉了待删除节点~ 这种方法的时间复杂度为O(1),显而易见比上面方法好的多,有了大体思路后,还要考虑的更全面一些,将一些边界情况考虑到,待删除节点是尾结点,整个链表只有一个节点,这样才能让面试官肯定你的能力,细节决定成败嘛。
function deleteNode(pHead, pToDeleteNode){
if(!pHead || !pToDeleteNode) return ;
//要删除的节点不是尾节点
if(pToDeleteNode.next != null){
var pNext = pToDeleteNode.next;
pToDeleteNode.value = pNext.value;
pToDeleteNode.next = pNext.next;
delete pNext;
}else if(pHead == pToDeleteNode){
delete pToDeleteNode;
}
//多个节点,删除尾节点
else{
var pNext = pHead.next;
while(pNext.next != pToDeleteNode){
pNext = pNext.next;
}
delete pToDeleteNode;
pNext.next = null;
}
}