删除链表的节点

164 阅读1分钟

常规思路是遍历整个链表,找到当前节点的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;
  }
}

同步git地址:https://github.com/mananl/algorithm/issues/3