在O(1)时间删除链表结点,首先分析链表是不是空的,其次要分析要删除的结点是否存在,最后分析链表是不是要删除的尾结点。
其实现过程如下所示:
package cn.edu.nwu.structs.linklist;
/**
* @author jcm
*
*时间 2016年8月28日
*/
public class DeleteNode {
/**
* @author jcm
* @param head 头指针
* @param toBeDeletedNode 要删除的结点
* @return 返回头指针
*/
public static Node deleteNode(Node head,Node toBeDeletedNode){
//判断删除的结点是否是存在或者头指针是否为空
if(head == null || toBeDeletedNode == null){
System.out.println("删除结点不合法");
return head;
}else if(head == toBeDeletedNode){//如果只有一个结点,头指针指向它
toBeDeletedNode = null;
head = null;
return null;
}else if( toBeDeletedNode.next != null){//删除的是中间结点,时间复杂度是O(1)
Node pNext = toBeDeletedNode.next;
toBeDeletedNode.data = pNext.data;//覆盖要删除的结点
toBeDeletedNode.next = pNext.next;//删除的结点重新指向下一个结点的指针指向地点
pNext = null;//释放要删除的结点的下一个 结点,因为这个结点的内容已经覆盖了要删除的结点
}else{
Node currentNode = head;//如果要删除的是尾结点,那么不能在O(1)时间内删除,需要遍历整个链表
while(currentNode.next != toBeDeletedNode){
currentNode = currentNode.next;
}
//如果是尾结点,则只要找到尾结点的前一个结点,把它的next指向null,就可以删除尾结点
currentNode.next = null;
toBeDeletedNode = null;
}
return head;
}
}