题目:给定单向链表的头引用和一个节点的引用,定义一个函数在O(1)时间删除该节点。链表节点与函数的定义如下。
public class ListDmeo {
public static void main(String[] args) {
ListNode head = new ListNode(4);
head.next = new ListNode(11);
head.next.next = new ListNode(6);
head.next.next.next = new ListNode(2);
head.next.next.next.next = new ListNode(43);
head.next.next.next.next.next = new ListNode(13);
head.next.next.next.next.next.next = new ListNode(9);
head.next.next.next.next.next.next.next = new ListNode(5);
head.next.next.next.next.next.next.next.next = new ListNode(8);
head.next.next.next.next.next.next.next.next.next = null;
printList(head);
System.out.println();
ListNode node = new ListNode(8);
head = deleteNode(head,node);
printList(head);
}
private static ListNode deleteNode(ListNode head, ListNode node) {
/**
* 当链表为空或删除的节点为空时,直接返回链表
*
* */
if(head == null || node == null){
System.out.println("没有删除的节点!!!");
return head;
}
/**
*
* 当删除的是第一个时
* */
if(head.value == node.value){
System.out.println(node.value+"被删除了!!!");
head = head.next;
return head;
}
/**
* 当删除的节点不为第一个时
* */
ListNode head1 = head.next;
/**
* 保留被删除的节点的前一个节点
* */
ListNode head2 = head;
while(head1 != null){
if(head1.value == node.value){
head2.next = head1.next;
System.out.println(node.value+"被删除了!!!");
}
head1 = head1.next;
head2 = head2.next;
}
return head;
}
/**
* 打印链表
*
* */
private static void printList(ListNode head) {
while(head != null){
System.out.print(head.value + " ");
head = head.next;
}
}
}
/**
*
* 节点类
* */
class ListNode{
public int value;
public ListNode next;
public ListNode(int value){
this.value = value;
}
public ListNode(){}
}