删除单链表的第i个位置的结点,首先需要判断是不是空链表,其次判断删除位置是否合法,最后判断是不是删除第一个结点,实现过程如下所示:
package cn.edu.nwu.structs.linklist;
/**
* @author jcm
* 删除链表第i个位置的结点
* 时间 2016年8月23日
*/
public class DeleteLinkListNode {
public static Node deleteLinkListNode(Node head,int i){
if(head == null){
return null;
}
//前一个结点指向头指针
Node preNode = head;
int k = 0;
//preNode.next!=null意思是前一个结点指向的下一个结点不存在,说明不存在要删除的结点
while(preNode.next!=null && k < i-1){
//因为k是从0开始计时的,所以要比前一个结点慢一步,所以把条件语句放在最前面
//说明已经找到要删除结点的前一个位置
if(++k == i-1){
break;
}
preNode = preNode.next;
}
if(k != i-1){
return null;//说明没有找到第i个位置
}
//判断删除的结点是不是头指针
if(i == 1){
head = head.next;
//释放无用的结点
preNode = null;
}else{
//要删除当前的结点,并且要释放无用的当前结点
Node currentNode = preNode.next;
preNode.next = currentNode.next;
currentNode = null;
}
return head;
}
}