链表是一种递归的数据结构,或者为空(null),或者含有泛型元素的结点和指向另一条链表的引用
class Node{
Item item;
Node next;
}
已知一个链表的首结点first,删除链表的尾结点
思路如下(这尼玛字儿也太丑了,凑合看吧)
void deleteLast(){
//第一步,将令current与first指向同一个链表
Node current = first;
//若链表为空则不做任何操作
if(current==null) {return;}
//若链表不为空则令next为current的下一个结点
Node next = current.next;
//如果链表中仅有一个元素,令first为null
if(next == null) {first = null;}
else {
//循环操作直至next.next为空
while(next.next!=null) {
current = next;
next = current.next;
}
//当next.next为null时,令current.next为null
current.next = null;
}
}
链表9、8、7、6...0; 测试结果如下
失败代码对比(左图为失败品,并没有删除尾结点)
将右图中的最后一行代码current.next = null 改为 next = null同样会失败。
左图运行Debug过程如下,first的尾结点id与current的id相同, 说明current确实是指向了first的尾结点。但是当运行最后一步,令current = null,而first的尾结点并没有改变。
因为令current=null,只是将current重新指向了另一个空对象null;并不能改变其原指向的first尾结点。也就是说只是将current重定向了而已,并没有改变原有对象。