对引用的操纵–链表算法的核心
1.与C++的区别
java的链节点定义如下:
class Link(){
public int Data;
public Link next;
}
- **区别Java在 Link类中包含了一个Link类型的对象,但是C ++不能在类中使用一个自引用的类定义;
- C++只能使用一个只向Link对象的指针;
- 指针的作用和引用是类似的。
2.引用和基本类型
在上面的代码中,Link对象其实没有真正包含另一个Link对象,只是对对象的"引用"。
一个引用是对于某个对象的参照数值,它是一个对象在计算机内存中的地址,并不是具体的对象值。在给定的计算机/操作系统中,所有的引用所占的大小是一样的。所以编译器知道字段的大小并由此构造出整个对象。
基本类型:double a = 100.0; 它是实实在在的在计算机中创建了一个空间,并把100.0放入了这个空间。
而 Link link ,创建空间还需要new。
3.两句理解链表唯一关键的代码
public void Insert(int data){
Link newlink = new Link(data);
newlink.next = first;
first = newlink;
}
上述是头插法的函数
- newlink.next = first newlink是分配了空间的link节点,这句的意思是为newlink的next 域赋值,很明显,赋的必须是Link类型的值。把next域赋为first,就是新节点的指向(下一个节点)。
- first = newlink;再让新节点为First(头节点)。
补充
对于链表的删除操作还需要注意
public Link delete(int key){
Link current = first;
Link previous = first;
while(current.Date! = key){
if(current.next == null)
return null;
else {
previous = current;
current = current.next;
}
}
if(current == first)
first = first.next;
else
previous.next = current.next;
return current;
}
上面的代码设置有前驱和后继,用来记录沿着链表寻找数据域为key的节点并删除它。
- 知道怎么才算删除:改变前驱的next域(如:删除c节点,只需要让b节点的next域变为d即可(不考虑内存空间的话))
- 如下图,首先pre和current都是指向first节点的,然后开始判断current的数据域是否是key值,如果是,就不进行while循环里面的内容,直接让pre.next = current.next 。如果不是, 就执行previous = current; current = current.next;
相当于key是雷,current先去踩雷(while循环的判断语句),不是key再让pre指向它,以确保pre一定是删除节点的前驱
本文是利用CSDN编写的Markdown格式导出再修改。