part1:代码:注意最后不能直接写成ints=template,因为ints是在method中新建立的指向传入数组的引用,ints=template只是改变了ints的指向,而对传入的数组未改变,所以应该用循环对ints数组逐一赋值(这一问题lecture里面记得有专门讲过,看的时候没太注意听,编程的时候才发现都是坑啊2333)。
public static void smoosh(int[] ints) { int[]template=new int[ints.length]; Arrays.fill(template, -1); int num=1; template[0]=ints[0]; for(int i=1;i<ints.length;i++){ if(ints[i]!=template[num-1]) { template[num]=ints[i]; num++; } } for(int i=0;i<ints.length;i++) ints[i]=template[i]; }
part2 代码:注意比较SListNode.item时需要用object.equals()的方法,而不能直接用==,==只能用于primitive type比较值,用于Object可以理解为比较的是类似C++里面的地址吧,
一开始没注意这个问题直接写到currentNode.item==currentNode.next.item,列表根本就没变化,因为两个item的地址始终都不一样。
public void squish() { SListNode currentNode=head; while(size>1&¤tNode.next!=null){ if(currentNode.item.equals(currentNode.next.item)){ currentNode.next=currentNode.next.next; size--; } else currentNode=currentNode.next; } }
part 3:唯一一个没有改动的部分,感觉这个比前两个还是简单一些哈。
public void twin() { if(isEmpty()) return; SListNode currentNode=head; for(int i=1;i<=this.size;i++){ SListNode newest=new SListNode(currentNode.item,currentNode.next); currentNode.next=newest; currentNode=currentNode.next.next; } size=size*2; }
运行结果: