面试题13:在O(1)时间删除链表结点

来源:互联网 发布:怎么查看网络是否稳定 编辑:程序博客网 时间:2024/06/07 21:45

转自http://blog.csdn.net/qq1501340219/article/details/54612616?locationNum=14&fps=1

题目描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

题目解析:如果从头到尾遍历找到要删除的节点的前一个节点,将前一个节点的next指针指向删除节点的next,那么时间复杂度是O(n)。所以不能这样做。如果采取是将删除节点的下一个节点的值复制到要删除的节点,然后再将下一个节点删除,那么时间复杂度就是O(1)。如果要删除的节点是最后一个节点,那么我们还是需要遍历链表。所以总时间复杂度应该这么算,[(n-1)*O(1)+O(n)]/n,结果是O(1)。

//给出头结点和要删除的节点,在O(1)时间内删除    public static ListNode deleteNode(ListNode head, ListNode delete) {        if (head == null || delete == null) {            return head;        }        //如果要删除的节点就是头结点,则直接删除        if (head == delete) {            return head.next;        }        //如果要删除的节点是尾结点,则遍历找到上一个结点,然后删除        if (delete.next == null) {            ListNode temp = head;            while (temp.next != delete) {                temp = temp.next;            }            temp.next = null;        } else {//不是尾结点,则通过将要删除结点的下一个结点复制到要删除结点            delete.data = delete.next.data;            delete.next = delete.next.next;        }        return head;    }
阅读全文
0 0
原创粉丝点击