在O(1)时间删除链表中的节点

剑指offer-每日一练

在O(1)时间删除链表中的节点

乍一看,其实还是比较简单的;

由于是链表这样的数据结构,就删除这个操作来说,在O(1)时间删除完全没有问题;

但是,在删除之前,需要查找到该节点,同样由于链表的特殊性,需要从头开始遍历该链表,删除查找到的第一个和设定条件一致的节点;(链表中也可能存在多个这样的节点,题目未说明,假定出现的第一个,后续可以思考如何删除所有这样的节点!)

package practise;

import structure.ListNode;

/**
 * @author :lonus_lan
 * @date :Created in 2020/1/14 19:45
 * @description: this is the way of delete a node in nodelist in O(1)
 * @modified By:
 */
public class DeleteNodeInList {

    /**
     * 删除节点在O(1)时间
     * @param head 结点列表
     * @param node 待删除的节点
     * @return 删除后的结点列表
     */
    public static ListNode<Integer> deleteNodeInListInO1(ListNode<Integer> head, ListNode<Integer> node){
        if (head == null || node == null){//鲁棒性
            return null;
        }
        if (head == node){//待删除的节点是头节点
            return head.next;
        }else if (node.next != null){//待删除的节点位于结点列表中部
            node.val = node.next.val;
            node.next = node.next.next;
            return head;
        }else {//待删除的节点位于尾部
            ListNode<Integer> temp = head;
            while (temp.next != node){//找到待删除尾节点的上一个元素
                temp = head.next;
            }
            temp.next = null;//将尾节点置空
            return head;
        }
    }

    public static void main(String[] args) {
        ListNode<Integer> head = new ListNode<>(1);
        ListNode<Integer> node2 = new ListNode<>(2);
        ListNode<Integer> node3 = new ListNode<>(3);
        head.next = node2;
        node2.next = node3;
        System.out.println(head);
        head = deleteNodeInListInO1(head,node3);
        System.out.println(head);
        head = deleteNodeInListInO1(head,head);
        System.out.println(head);
    }

}

不难。。。

posted @ 2020-01-14 20:01  lonuslan  阅读(268)  评论(0)    收藏  举报