剑指offer——在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个指针,定义一个函数在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;
	}
}

通过图示展示过程:

剑指offer——在O(1)时间删除链表结点_第1张图片

下面请看具体代码实现:

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的调用者。

你可能感兴趣的:(数据结构与算法,链表,java,算法)