在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);
}
}
不难。。。
Always fail, never succeed

浙公网安备 33010602011771号