class="MsoNormal">自定义链表(一)——小试牛刀
我们除了上次我们讲到自定义队列,当然,我们同样可以自定义链表,不过我觉得自定义链表要比自定义队列更抽象,所以,当你顿悟到自定义列表的奥义时,内心的成就感好强烈的说,恨不得一下子吧他更多的方法都实现。在我最初与自定义链表交手的时候最容易犯的错误就是空指针。所以,大家一定要注意啊,链表可不是随随便便就能打倒的小怪兽啊~要加油哦;
在编写自定义链表的时候,我们不仅需要编写整个链表的实现代码,也要编写节点,节点很简单待会儿看代码大家就知道了:
首先是节点代码
文件:
这里我我同样使用了泛型以不同的数据结构
package linePackage;
?
public class LinkNoke<E> {
?
???????? private E? e;//我们想存的数据就放在这里面
???????? private LinkNoke next;//连接下一个数据(存放下一个数据的地址)
???????? public LinkNoke(){
???????? }
???????? public LinkNoke(E e){
?????????????????? this.e = e;
???????? }
???????? public Object getObject(){
?????????????????? return e;
???????? }
???????? public void setObject(E e){
?????????????????? this.e = e;
???????? }
???????? public LinkNoke getNext(){
?????????????????? return next;
???????? }
???????? public void setNext(LinkNoke next){
?????????????????? this.next = next;
???????? }
????????
}
链表:
文件:
package linePackage;
?
publicclass LinkQuaue<E> {
??? private LinkNoke root;
??? private LinkNoke last;
//注意:root和last是自定义链表必须有的两个属性;否则会导致错误,有些同学把只last定义在last内,结果永远只有一个节点……
??? publicvoid add(E e){
??? LinkNoke<E> next = new LinkNoke(e);
//如果链表为空????
if(root==null){//注意:如果对象为空,他的方法和属性都无法被调用,否则就会报空指针异常,所以一定要注意,在使用他之前一定要保证他被系统分配了内存空间可以以LinkNoke<E> next = new LinkNoke(e);这种方式,或者以root = new LinkNoke();的方式都可以
?????????? //root = new LinkNoke();
?????????? root = next;
?????????? last = root;?
//如果添加的元素第一个元素:收尾相同;
?????? }else{//如果链表不为空
?????????? last.setNext(next);
?????????? //last.setObject(e);
?????????? last = next;
?????? }
??? }
//获取某个节点
??? public Object getLinkNoke(int index){
?????? int count=0;
?????? LinkNoke<E> next = new LinkNoke();
?????? next = root;
?????? while(count!=index){
?????????? next = next.getNext();
?????????? count++;
?????? }
?????? return next.getObject();
??? }
//删除要分三种情况:删第一个,删中间,删最后一个
??? publicvoid deletLinkNoke(int index){
?????? int count=0;
?????? LinkNoke<E> next = new LinkNoke();
?????? LinkNoke<E> before = new LinkNoke();
?
?????? if(index==0){//如果删的是第一个
???????? root = root.getNext();
????????
?????? }
?????? else{//否则——
?????????? next = root;
?????? while(count!=index-1){
?????????? next = next.getNext();
?????????? count++;
?????? }if(this.getLength()>index)/*如果删的不是最后一个*/{
?????? before=next;
??????
?????? while(count!=index+1){
?????????? next = next.getNext();
?????????? count++;
?????? }
?????? before.setNext(next);
?????? }else{//否则直接让倒数第二个接null
?????????? next.setNext(null);
?????????? last = next;
?????? }
?????? }
??????
??? } //
?
??? publicint getLength(){
?????? int count =0;
?????? LinkNoke<E> next = new LinkNoke();
?????? next = root;
??????
?????? while(next.getNext()!=null){
?????????? next = next.getNext();//一开始少了这个……死循环
?????????? count++;
?????? }
??????
?????? return count;
??? }
?
}
//之后我会将这段代码的其他方法补上,大家耐心等等哈~
?
?