题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点
本题目关键点在于考虑各种情况,还有最后的节点在中间的删除方式也是比较巧妙的
package 剑指offer;
/* 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内
* 删除该节点*/
public class Test13 {
public static void main(String args[]){
ListNode head = new ListNode();
head.value = 1;
head.next = new ListNode();
head.next.value = 2;
head.next.next = new ListNode();
head.next.next.value = 3;
head = Test13.deleteNode(head, null);
Test13.printNum(head);
}
public static class ListNode{
int value;
ListNode next;
public void addValue(int value){
this.value = value;
}
}
public static ListNode deleteNode(ListNode head, ListNode toDelete){
// 如果输入的值是空的,就返回head
if(head == null || toDelete == null){
return head;
}
// 如果要删除的是头结点,就返回头结点的第二个节点
if(head == toDelete){
return head.next;
}
if(toDelete.next == null){
ListNode temp = head;
while(temp != toDelete){
temp = temp.next;
}
temp.next = null;
}else{
// 这个比较巧妙,也就是当要删除的是一个中间节点时,应该这样做
toDelete.value = toDelete.next.value;
toDelete.next = toDelete.next.next;
}
return head;
}
// 根据头结点来一次输出链表中的元素
public static void printNum(ListNode head){
while(head != null){
System.out.println(head.value);
head = head.next;
}
System.out.println("null");
}
}
尽所有可能考虑各种情况,你永远不知道输入的是什么