剑指offer面试题13:在O(1)时间删除链表结点(java实现)

题目:给定单向链表的头结点和待删除结点,定义一个函数在O(1)时间内删除该结点。
思路:一般删除结点方法为找到该结点上一个结点,并将上一个结点的下一个结点指向待删除结点的下一个结点。这样的方法时间复杂度为O(n)。
另一个思路为:要删除结点i,先把i的下一个结点j的内容复制到i,然后把i的指针指向结点j的下一个结点。此时再删除结点j,其效果刚好是把结点i删除。
需要考虑的问题是:如果要删除的结点位于链表尾部,那么没有下一个结点。则仍需从头到尾遍历。
如果链表只有一个结点,则删除这个结点之后,还需要把头结点设置为NULL。

struct ListNode{
  int nodeValue;
  ListNode next;
}

public void deleteNode(ListNode pHead, ListNode pDelNode){
    if(pHead==null || pDelNode==null){
        return;
    }
    if(pDelNode.next!=null){ //要删除的结点不是尾部结点
        ListNode pNext = pDelNode.next;
        pDelNode.data = pNext.data;
        pDelNode.next = pNext.next;
    }else if(pHead == pDelNode){ //链表只有一个结点,删除头结点
        pHead = null;
        pDelNode = null;
    }else{ //链表中有多个结点,删除尾结点
        ListNode pNode = pHead;
        while(pNode.next != pDelNode){
            pNode = pNode.next;
        }
        pNode.next = null;
    }
}

你可能感兴趣的:(剑指offer面试题13:在O(1)时间删除链表结点(java实现))