教你在Java中玩转单链表2014-07-11 iteye cq520学会了单链表的基本操作之后,我们就可以自定义一些非常有意思的功能了,例如对单链表中的元素进行排序,(排序规则可以由自己定),将链表翻转等等,这里主要是讲老师布置的几个问题,我觉得也非常有趣,大家也可以思考一下,由于这些方法几天前就写完了,五一假在家中也没有对之前的链表进行更多的修改了,所以还是用之前所写过的单链表结构继续添加功能吧。在实现所有功能之前先来个前言,接下来的这两个方法对后面的每一步都是至关重要的,第一个是获取链表长度的方法:获取链表长度的方法其实可以是打印链表方法的翻版,我最开始的时候也是这样做的,不过后来发现了一个更好的更不容易出错的方法,在链表类中定义一个size属性 int size=0;然后在所有的对链表有长度修改的方法中都对size进行一次修改,例如添加元素的方法最后加一句size++,删除元素的方法最后加一句size--等等(当然size不能小于0)。这样获取size的方法中只需要一句话就可以解决了:int size(){ return size; }另外一个就是获取指定位置结点元素的方法,如下:
Java代码
/** * 查找指定位置结点元素的方法 */public Node get(int index){Node node=head;int j=1;//找到第indexwhile(node!=null&&j<index){node=node.next;j++;}return node;}
下面在具体问题中来看一下这两个方法的应用吧。1.对链表中的元素进行排序(如果链表中的元素是整数的话)相信看完前两个方法之后,排序的方法已然在心中出现了,如果这不是一个单链表而是一个数组的话,对数组进行排序相信大家都不会陌生了,所以这里也只是用到了最简单的冒泡排序思想而已:Java代码
/*** 如果链表中的元素是整型元素,则排列链表 */public void sort(){Object obj=null;Node temp=new Node(obj);//媒介结点for(int i=0;i<=size();i++){for(int j=i+1;j<=size();j++){//冒泡排序思想,交换数据域if(Integer.parseInt((String)get(i).obj)>Integer.parseInt((String)get(j).obj)){temp.obj=get(i).obj;get(i).obj=get(j).obj;get(j).obj=temp.obj;}}}}
2.将链表中的元素封装到一个数组当中看到这里大家可能会觉得奇怪,为什么这个方法不写在上面,第一个方法不就是利用了这个思想么?其实只是因为我是在做完第一个题目之后才想到的这个方法,所以放在之后讲,我想这正跟我们的学习过程一样,很多简单的方法是在做了复杂的方法之后才想出来的:Java代码
/*** 将链表封装成一个对象数组 */public Object[] toArray(){//创建Object obj[]=new Object[size()];Node node=head;int j=0;while(node!=null&&j<obj.length){obj[j++]=node.obj;node=node.next;}return obj;}