由于链表的内存不是一次性分配的,因而无法保证链表的内存和数组一样是连续的。如果想查找某一个节点,则只有从头节点开始遍历,其时间效率为O(n);在数组中可根据下标来找到目标的元素,其时间效率为O(1); 如果想要找到某一节点的值或者某个数组位置存储的值,则时间效率都为O(n);
代码以及相关说明如下:
/**
* 删除链表中的某一节点
*
* @param headNode 头节点
* @param value 目标值
* @return 链表的头节点
*/
private ListNode deleteNode(ListNode headNode, int value){
if (headNode == null){
// 如果链表的头结点不存在, 则返回头结点(null)
return headNode;
}
// 将头结点赋给headNode1, 一半在后面的操作中能够找到初始的头结点
ListNode headNode1 = headNode;
if (headNode.getValue() == value){
// 如果头结点的值就是目标值,则替换头结点(不在返回headNode1, 返回调整后的头结点headNode)
headNode = headNode.getListNode();
return headNode;
}
while (headNode.getListNode() != null && headNode.getListNode().getValue() != value){
// 如果下一个节点不为空,并且下一个节点的值不是目标值;则继续遍历链表的下一个节点
headNode = headNode.getListNode();
}
if (headNode.getListNode() != null){
// 如果说下一个节点不为空,说明下一个节点的值是目标节点,则删除该节点
headNode.setListNode(headNode.getListNode().getListNode());
// 最后返回初始的头结点
return headNode1;
} else {
// 如果都没有找到目标值,返回初始的头结点
return headNode1;
}
}
删除链表,关键在于要明确节点的意义和指针的意义。