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

题目描述

在O(1)时间删除链表结点

代码示例

public class Offer13 {
    public static void main(String[] args) {
        //构建链表
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        //打印原始链表
        Offer13 testObj = new Offer13();
        testObj.printList(head);
        //删除第二个节点,打印链表
        ListNode firstDeleteNode = head.next;
        testObj.deleteNode(head, firstDeleteNode);
        testObj.printList(head);
        //删除最后一个节点,打印链表
        ListNode secondDeleteNode = head.next;
        testObj.deleteNode(head, secondDeleteNode);
        testObj.printList(head);
    }

    private static class ListNode {
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }
    //删除节点
    public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
        if (head == null || tobeDelete == null) {
            return null;
        }

        if (tobeDelete.next != null) {
            //要删除的节点不是尾节点
            ListNode next = tobeDelete.next;
            tobeDelete.val = next.val;
            tobeDelete.next = next.next;
        } else {
            if (head == tobeDelete) {
                head = null;
            } else {
                ListNode cur = head;
                while (cur.next != tobeDelete) {
                    cur = cur.next;
                }
                cur.next = null;
            }
        }
        return head;
    }
    //打印链表
    private void printList(ListNode head) {
        if (head == null) {
            return;
        }
        while (head != null) {
            System.out.print(head.val + " ");
            head = head.next;
        }
        System.out.println();
    }
}
posted @ 2020-06-16 00:25  IT小磊  阅读(70)  评论(0编辑  收藏  举报