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

来源:互联网 发布:手机用电脑网络上网 编辑:程序博客网 时间:2024/05/16 17:49

这里写图片描述

解题思路:

一般情况下,删除链表中的某一结点D,需要从头开始遍历链表得到结点D的前驱结点,再进行删除操作,而此时的时间复杂度就是O(n)。
题目要求在O(1)时间内删除结点,就不可能对链表进行遍历操作;而遍历操作的目的是得到前驱结点,那么我们是不是可以通过直接得到的后继结点来达到删除的目的!


代码实现:注意边界值!!!

package jianzhi;public class Test13 {    /**     * 链表结点     */    public static class ListNode {        int value; // 保存链表的值        ListNode next; // 下一个结点    }    /**     * 给定单向链表的头指针和一个结点指针,定义一个函数在0(1)时间删除该结点,     * 【注意1:这个方法和文本上的不一样,书上的没有返回值,这个因为JAVA引用传递的原因,     * 如果删除的结点是头结点,如果不采用返回值的方式,那么头结点永远删除不了】     * 【注意2:输入的待删除结点必须是待链表中的结点,否则会引起错误,这个条件由用户进行保证】     *     * @param head        链表表的头     * @param toBeDeleted 待删除的结点     * @return 删除后的头结点     */    public static ListNode deleteNode(ListNode head, ListNode toBeDeleted) {        // 如果输入参数有空值就返回表头结点        if (head == null || toBeDeleted == null) {            return head;        }        // 如果删除的是头结点,直接返回头结点的下一个结点        if (head == toBeDeleted) {            return head.next;        }        // 下面的情况链表至少有两个结点        // 在多个节点的情况下,如果删除的是最后一个元素或者要删除的结点不在该链表中        if (toBeDeleted.next == null) {            // 找待删除元素的前驱            ListNode tmp = head;            while (tmp != null && tmp.next != toBeDeleted) {                tmp = tmp.next;            }            if (tmp == null) {                return null;            }            // 删除待结点            tmp.next = null;        }        // 在多个节点的情况下,如果删除的是某个中间结点        else {            // 将下一个结点的值输入当前待删除的结点            toBeDeleted.value = toBeDeleted.next.value;            // 待删除的结点的下一个指向原先待删除引号的下下个结点,即将待删除的下一个结点删除            toBeDeleted.next = toBeDeleted.next.next;        }        // 返回删除节点后的链表头结点        return head;    }    /**     * 输出链表的元素值     *     * @param head 链表的头结点     */    public static void printList(ListNode head) {        while (head != null) {            System.out.print(head.value + "->");            head = head.next;        }        System.out.println("null");    }    public static void main(String[] args) {        ListNode head = new ListNode();        head.value = 1;        head.next = new ListNode();        head.next.value = 2;        head.next.next = new ListNode();        head.next.next.value = 3;        head.next.next.next = new ListNode();        head.next.next.next.value = 4;        ListNode middle = head.next.next.next.next = new ListNode();        head.next.next.next.next.value = 5;        head.next.next.next.next.next = new ListNode();        head.next.next.next.next.next.value = 6;        head.next.next.next.next.next.next = new ListNode();        head.next.next.next.next.next.next.value = 7;        head.next.next.next.next.next.next.next = new ListNode();        head.next.next.next.next.next.next.next.value = 8;        ListNode last = head.next.next.next.next.next.next.next.next = new ListNode();        head.next.next.next.next.next.next.next.next.value = 9;        head = deleteNode(head, null); // 删除的结点为空        printList(head);        ListNode node = new ListNode();        node.value = 12;        head = deleteNode(head, head); // 删除头结点        printList(head);        head = deleteNode(head, last); // 删除尾结点        printList(head);        head = deleteNode(head, middle); // 删除中间结点        printList(head);        head = deleteNode(head, node); // 删除的结点不在链表中        printList(head);    }}
阅读全文
0 0
原创粉丝点击