看到書裏關於讓鏈表逆序的方法,是從鏈表的尾巴開始把數據把數據複製到一新的鏈表上去,以此循環。對於鏈表這種線性結構來說,要訪問一個元素都要從頭遍歷。這個算法的效率絕對不好。是(n-1)!。
- /**
- * p194 第四題
- * 逆序鏈表
- * @param source
- * @return
- */
- public static Node antitone(Node source){
- Node copyHead = null;
- Node copyTail = null;
- Node temp;
- int n;
- if(source==null)
- return null;
- temp=source;
- n=listLength(source);
- System.out.println(n);
- for(int i=n-1;i>0;i--){
- temp=source;
- for(int j=0;j<i;j++){
- temp=temp.link;
- }
- if(i==n-1){
- copyHead=new Node(temp.data,null);
- copyTail=copyHead;}
- else{
- copyTail.addNodeAfter(temp.data);
- copyTail=copyTail.link;}
- }
- return copyHead;
- }
我想了一個逆轉鏈表的算法,效率是線性的。只需遍歷每個節點。用一個指針保存一個節點,然後在下次循環中將下個節點指向前一個節點。
代碼如下:
- /**
- * 逆轉鏈表
- * @param source
- * @return 原鏈表的尾指針,轉換後的頭指針
- */
- public static Node antitone(Node source){
- Node c1=null,c2=null;
- while(source!=null){
- c2=source.link; //要操作的節點
- source.link=c1;//指向前一個節點
- c1=source;//暫存的節點
- source=c2;//指向下一個節點,繼續循環
- }
- return c1;
- }