题目:给定单向链表的头指针和一个指针,定义一个函数在O(1)时间删除该结点
class Node{//创建链表类
String value;
Node next;
public Node(String value) {
// TODO Auteo-generated constructor stub
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
通过图示展示过程:
下面请看具体代码实现:
public class Delete {
public static void DeleteNode(Node Head,Node ToBeDelete){
if(Head==null||ToBeDelete==null)
return;
//要删除的节点不是尾结点
if(ToBeDelete.next!=null){
//要删除的是ToBeDelete结点
Node node=ToBeDelete.next;
ToBeDelete.value=node.value;
ToBeDelete.next=node.next;
node=null;
}
//如果链表只有一个结点,删除头结点
else if(Head==ToBeDelete){
Head=null;
ToBeDelete=null;
}
//如果要删除的是尾结点
else{
while(Head.next!=ToBeDelete){
Head=Head.next;
}
Head=null;
}
}
public static void main(String[] args) {
Node head=new Node("a");
Node node1=new Node("b");
Node node2=new Node("c");
Node node3=new Node("d");
//初始化链表
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
System.out.println("打印链表反转后:");
DeleteNode(head,node2);
while(head!=null){
System.out.println(head.value);
head=head.next;
}
}
}
提示:如果面试题关于n位整数并且没有限定n的取值范围,或者是输入了任意大小的整数,那么这个题目很有可能是需要考虑大数问题的,最好使用字符串,值得注意的是,我们的代码仍然是不完整的,我们需要O(n)的时间才能判断链表中是否包含某一节点,但是受到O(1)的限制,我们不得不把确保结点在链表中的责任推给了函数DeleteNode的调用者。