删除链表的节点

2020-09-13  本文已影响0人  凯玲之恋

问题一:在O(1)时间内删除链表节点


public class E18DeleteOneListNode {

    private static class ListNode{
        //链表结构
        int value;
        ListNode nextNode;
    }

    //没有考虑到待删除节点不在链表中的情况
    public static void deleteOneListNode(ListNode head, ListNode nodeToBeDeleted){
        if (head == null || nodeToBeDeleted == null)
            return;
        //待删除节点不是尾节点
        if (nodeToBeDeleted.nextNode != null){
            ListNode node = nodeToBeDeleted.nextNode;
            nodeToBeDeleted.value = node.value;
            nodeToBeDeleted.nextNode = node.nextNode;
        }
        //又是尾节点又是头节点
        else if (head == nodeToBeDeleted){
            head = null;
        }
        //是尾节点但不是头节点
        else{
            ListNode node = head;
            while(node.nextNode != nodeToBeDeleted){
                node = node.nextNode;
            }
            node.nextNode = null;
        }
    }
}

对于n-1个非尾节点而言,我们可以在O(1)时间内把下一个节点的内存复制覆盖要删除的节点,并删除下一个节点;对于尾节点而言,由于仍然需要顺序查找,时间复杂度是O(n)。因此,总的平均复杂度是[(n-1)xO(1)+O(n)]/n,结果还是O(1)

因为它基于一个假设:要删除的节点的确在链表中。我们需要O(n)的时间才能判断链表中是否包含某一节点。受到O(1)时间的限制,我们不得不把确保点在链表中的责任推给了函数DeleteNode的调用者。

参考

删除链表的节点(Java实现)

上一篇下一篇

猜你喜欢

热点阅读