随笔 - 0  文章 - 3  trackbacks - 0
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿

文章档案(50)

搜索

  •  

最新评论

习题3.写一个算法,假设单链表的表头指针head表示,其类型为LinkList,

写出将其所有节点按相反次序连接的算法


这个算法的效率不高,因为前提是单链表,


所以要重复查找,我想了半天,得出的最优算法是返回最末节点,并删除,


将最末的节点添加到新的链表中,就形成了反转的链表,


如果用双链表的话,效率会有很大的提高.


算法如下:


java 代码


java 代码




  1. class Node{   

  2.     int element;   

  3.     Node next;   

  4.     public Node(int e){   

  5.         this(e,null);   

  6.     }   

  7.     public Node(int e,Node next){   

  8.         this.element=e;   

  9.         this.next=next;   

  10.     }   

  11. }   

  12. class LinkedList{   

  13.     public Node header;   

  14.     public LinkedList(){   

  15.         header=null;   

  16.     }   

  17.     public boolean isEmpty() {   

  18.         return header == null;   

  19.     }   

  20.     public void addtotail(int e){   

  21.         if (!isEmpty()) {   

  22.             Node temp = header.next;   

  23.             if (temp == null) {   

  24.                 header.next = new Node(e);   

  25.             } else {   

  26.                 while (temp.next != null) {   

  27.                     temp = temp.next;   

  28.                 }   

  29.                 temp.next = new Node(e);   

  30.             }   

  31.         } else {   

  32.             header = new Node(e);   

  33.         }   

  34.     }   

  35.     public Node deleteTail(){   

  36.         if(!isEmpty()){   

  37.             if(header.next!=null){   

  38.                 Node temp=header;   

  39.                 Node temp1=header.next;   

  40.                 while(temp1.next!=null){   

  41.                     temp1=temp1.next;   

  42.                     temp=temp.next;   

  43.                 }   

  44.                 temp.next=null;   

  45.                 return temp1;   

  46.             }   

  47.             else if(header.next==null){   

  48.                 Node temp=header;   

  49.                 header=null;   

  50.                 return temp;   

  51.             }   

  52.         }   

  53.         else{   

  54.             System.out.println("This is already a empty list");   

  55.         }   

  56.         return null;   

  57.     }   

  58.     public void printAll() {   

  59.         for (Node temp = header; temp != null; temp = temp.next) {   

  60.             System.out.print(temp.element + " ");   

  61.         }   

  62.     }   

  63.     public void reverse(LinkedList la,LinkedList lb){   

  64.         Node temp=null;   

  65.         temp=la.deleteTail();   

  66.         while(temp!=null){   

  67.             lb.addtotail(temp.element);   

  68.             temp=la.deleteTail();   

  69.         }   

  70.     }   

  71. }   

  72. public class Reverse {   

  73.     public static void main(String args[]){   

  74.         LinkedList La=new LinkedList();   

  75.         LinkedList Lb=new LinkedList();   

  76.         for(int i=1; i<27; i=i+3){   

  77.             La.addtotail(i);   

  78.         }   

  79.         La.printAll();   

  80.         System.out.println();   

  81.         Lb.reverse(La, Lb);   

  82.         Lb.printAll();   

  83.     }   

  84. }   




运行结果:


1 4 7 10 13 16 19 22 25

This is already a empty list

25 22 19 16 13 10 7 4 1


分析:


因为将链表La全部删除之后,已经是一个空链表,


所以再调用deleteTail的时候,会打印出This is already a empty list





评论也很精彩,请点击查看精彩评论。欢迎您也添加评论。查看详细 >>





JavaEye推荐
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA
广州:急招 JAVA开发经理/系统架构师(10-15K/月)也招聘java程序员
与Hibernate之父面对面-4月19日 Gavin King上海交流研讨会
高薪工作机会 美国法国上海 15-20k/月 J2EE SA



文章来源: http://xiaozhe.javaeye.com/blog/66485
posted on 2007-03-29 21:04 xiaozhe 阅读(85) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: