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

来源:互联网 发布:西安天网软件陈一丁 编辑:程序博客网 时间:2024/05/21 10:37

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

解题思路:
一般单向列表删除结点,就是从头遍历,找到这个结点之前的结点,指向这个结点之后的结点,就算是删除了这个结点。
这种方法的时间复杂度为O(n)
这里写图片描述

题目要求在O(1)时间内完成,所以应该避免遍历。
我们遍历的目的是为了找到这个结点前面的那个结点,所以我们可以采用下面的办法。
将待删除结点的下一个结点的值赋给待删除的结点,然后删除一个结点,就达到了删除结点的目的。

找到合适的算法之后,还有几种情况需要考虑:
1)正常, 多个结点,删除的不是尾结点。
2)只有一个结点,删除尾结点(也是头结点)
3)有多个结点,删除尾结点

代码如下:

public class DeleteNode {    static class ListNode{        int val;        ListNode next;         ListNode(int v){            this.val = v;        }    }    public static ListNode delete(ListNode head, ListNode toBeDelete){        if(head == null || toBeDelete == null){            return null;        }        //不是尾结点        if(toBeDelete.next != null){            ListNode node = toBeDelete.next;            toBeDelete.val = node.val;            toBeDelete.next = node.next;            node = null;        }        //只有一个结点,删除头结点        else if(head == toBeDelete){            toBeDelete = null;            head = null;            return null;        }        //多个结点,删除尾结点        else{            ListNode node = head;            while(node.next != toBeDelete){                node = node.next;            }            node.next = null;            toBeDelete = null;        }        return head;    }    public static void print(ListNode head){        if(head == null){            System.out.println("list is null");        }        while(head != null){            System.out.println(head.val);            head = head.next;        }    }    public static void main(String[] args) {        //测试代码        ListNode head = null;        print(delete(head, head));        head = new ListNode(0);        ListNode p = head;        //(3)只有一个结点,删除尾结点(也是头结点)        print(delete(head, head));        for(int i = 1; i < 5; i++){            ListNode node = new ListNode(i);            p.next = node;            p = p.next;        }        ListNode tail = new ListNode(5);        p.next = tail;        print(head);        print(delete(head, head));        //(2)多个结点,删除尾结点        print(delete(head, tail));        //(1)删除的不是尾结点        print(delete(head, head.next));    }}
0 0