java 数据结构

  1. 许多人都知道链表(C语言)都是借助指针来实现链接的,同样许多人也知道java语言是没有指针的,所以很多人可能很理所当然的认为 "java没有数据结构" ,我想这种想法是错误的.程序=算法+数据结构,任何语言都离不开数据结构(唉,这么简单一个道理我也是最近才悟出的,惭愧啊...).下面我就谈谈java语言的数据结构.  
  2.   
  3. 代码一:链表结构的java实现  
  4.   
  5.     package  listtest;  
  6.   
  7.     public   class  ListNode  {  
  8.              
  9.             Object element;  
  10.             ListNode  next;  
  11.                      
  12.             ListNode (Object o,ListNode  n)  
  13.             {  
  14.                     element=o;  
  15.                     next=n;  
  16.             }  
  17.              
  18.             ListNode (Object o)  
  19.             {  
  20.                     this (o, null );  
  21.             }  
  22.     }  
  23.   
  24. 代码二:链表操作器的java实现  
  25.   
  26.   
  27.     package  listtest;  
  28.   
  29.     public   class  LinkedList {  
  30.   
  31.             private  ListNode  header;  
  32.              
  33.             LinkedList()  
  34.             {  
  35.                     header=new  ListNode ( null );  
  36.             }  
  37.              
  38.             LinkedList(ListNode  n)  
  39.             {  
  40.                     header=new  ListNode ( null ,n);  
  41.             }  
  42.              
  43.             /**  
  44.              * 判断链表是否为空  
  45.              * @return 链表是否为空的布尔值  
  46.              */   
  47.             boolean  isEmpty()  
  48.             {  
  49.                     return  header.next== null ;  
  50.             }  
  51.              
  52.             /**  
  53.              * 清空链表.  
  54.              * 注:此方法没有真正清除内存,清楚内存的任务交给java垃圾回收器去处理吧.^_^  
  55.              */   
  56.             void  makeEmpty()  
  57.             {  
  58.                     header=null ;  
  59.                     System.gc();  
  60.             }  
  61.              
  62.             /**  
  63.              * 查找目标数据所在节点  
  64.              * @param o 目标数据  
  65.              * @return 保存目标数据节点  
  66.              */   
  67.             ListNode  find(Object o)  
  68.             {  
  69.                     if (isEmpty())  
  70.                             return   null ;  
  71.                      
  72.                     ListNode  node = header.next;  
  73.                     while (node!= null )  
  74.                     {  
  75.                             if (node.element.equals(o))  
  76.                                     return  node;  
  77.                              
  78.                             node=node.next;  
  79.                     }  
  80.                     return   null ;  
  81.             }  
  82.              
  83.             /**  
  84.              * 在节点node后面新建一个节点,该节点保存数据o  
  85.              * @param o 数据  
  86.              * @param node 插入节点  
  87.              */   
  88.             void  insert(Object o,ListNode  node)  
  89.             {  
  90.                     node.next=new  ListNode (o,node.next);  
  91.             }  
  92.              
  93.             /**  
  94.              * 删除目标数据的节点  
  95.              * @param o 目标数据  
  96.              */   
  97.             void  remove(Object o)  
  98.             {  
  99.                     if (isEmpty())  
  100.                             return ;  
  101.                      
  102.                     ListNode  node = header.next;  
  103.                     while (node!= null )  
  104.                     {  
  105.                             if (node.next.element.equals(o))  
  106.                             {  
  107.                                     node.next=node.next.next;  
  108.                                     return ;  
  109.                             }  
  110.                             node = node.next;  
  111.                     }  
  112.             }  
  113.     }  
  114.   
  115. 完成...参考了<数据结构(C语言版)>(hjack借我D书,呵呵,沾点仙气)和<数据结构与算法分析--java语言描述>,不过感觉原作者写得罗嗦了点,所以自己整理了下(原著的java实现用了3 个类,我觉得有点不必要).  
  116.   
  117. 接下来用链表解一道题.这道题是我去北电笔试的时候遇到的,当时做得乱七八糟(因为要求用C/C++做...晕...当时就投降了...).  
  118.   
  119. 题目是这样的:输入一串字符,分别统计各个字符的数目.(maybe大家都觉得很简单,,,但我当时确实不会...用力鄙视我吧...)  
  120.   
  121. 这题用了三个文件,其中两个分别是链表结构和链表操作器.  
  122.   
  123. 文件一:ListNode .java  
  124.   
  125.     package  list;  
  126.   
  127.   
  128.     public   class  ListNode  {  
  129.              
  130.             char  element;         //当前字符   
  131.             int  count;                 //字符个数   
  132.   
  133.             ListNode  next;  
  134.              
  135.             ListNode (char  c,ListNode  n)  
  136.             {  
  137.                     element = c;  
  138.                     count=1 ;  
  139.                     next=n;  
  140.             }  
  141.              
  142.             ListNode (char  c)  
  143.             {  
  144.                     this (c, null );  
  145.             }  
  146.     }  
  147.   
  148. 文件二:LinkedList.java  
  149.   
  150.     package  list;  
  151.   
  152.     public   class  LinkedList {  
  153.   
  154.             ListNode  header;  
  155.              
  156.             LinkedList()  
  157.             {  
  158.                     this ( null );  
  159.             }  
  160.              
  161.             LinkedList(ListNode  n)  
  162.             {  
  163.                     header=new  ListNode ( ' ' ,n);  
  164.             }  
  165.              
  166.             boolean  isEmpty()  
  167.             {  
  168.                     return  header.next== null ;  
  169.             }  
  170.              
  171.             void  makeEmpty()  
  172.             {  
  173.                     header=null ;  
  174.             }  
  175.              
  176.             ListNode  find(char  c)  
  177.             {  
  178.                     if (isEmpty())  
  179.                             return   null ;  
  180.                      
  181.                     ListNode  node = header.next;  
  182.                     while (node!= null )  
  183.                     {  
  184.                             if (node.element==c)  
  185.                                     return  node;  
  186.                              
  187.                             node=node.next;  
  188.                     }  
  189.                     return   null ;  
  190.             }  
  191.              
  192.             void  insert( char  c,ListNode  node)  
  193.             {  
  194.                     node.next=new  ListNode (c,node.next);  
  195.             }  
  196.              
  197.             void  remove( char  c)  
  198.             {  
  199.                     if (isEmpty())  
  200.                             return ;  
  201.                      
  202.                     ListNode  node = header.next;  
  203.                     while (node!= null )  
  204.                     {  
  205.                             if (node.next.element==c)  
  206.                             {  
  207.                                     node.next=node.next.next;  
  208.                                     return ;  
  209.                             }  
  210.                             node = node.next;  
  211.                     }  
  212.             }  
  213.     }  
  214.   
  215. 文件三:Test.java  
  216.   
  217.     package  list;  
  218.   
  219.     public   class  Test {  
  220.              
  221.             public   static   void  showCharCount( char  s[])  
  222.             {  
  223.                     System.out.println("原字符串是:" + new  String(s));  
  224.                     LinkedList list = new  LinkedList();  
  225.                     ListNode  node;  
  226.                     for ( int  i= 0 ;i<s.length;i++)  
  227.                     {  
  228.                             if ((node=list.find(s[i]))== null )  
  229.                                     list.insert(s[i],list.header);  
  230.                             else   
  231.                                     node.count++;                                 
  232.                     }  
  233.                      
  234.                     /*  
  235.                      * 打印链表  
  236.                      */   
  237.                     node = list.header.next;  
  238.                     while (node!= null &&!list.isEmpty())  
  239.                     {  
  240.                             System.out.println("字符:  '"   
  241.                                             +node.element+"'    出现:  "   
  242.                                             +node.count+"  次" );  
  243.                             node=node.next;  
  244.                     }  
  245.             }  
  246.              
  247.             public   static   void  showCharCount(String s)  
  248.             {  
  249.                     showCharCount(s.toCharArray());  
  250.             }  
  251.   
  252.             public   static   void  main(String[] args) {  
  253.   
  254.                     showCharCount("abcd ssd wool" );  
  255.   
  256.             }  
  257.     }  
  258.   
  259. 最后修饰下,把main方法写漂亮点:  
  260.   
  261.             public   static   void  main(String[] args)  throws  IOException{  
  262.   
  263.                     String s;  
  264.                     while ( true )  
  265.                     {  
  266.                             System.out.print("请输入待统计字符串:  " );  
  267.                             BufferedReader br = new  BufferedReader( new  InputStreamReader(System.in));  
  268.                             s = br.readLine();  
  269.                              
  270.                             if (s.length()>= 40 )  
  271.                             {  
  272.                                     System.out.println("请输入40个字符以内." );  
  273.                                     System.out.println("===============================\n" );  
  274.                                     continue ;  
  275.                             }  
  276.                             else   
  277.                                     break ;                         
  278.                     }  
  279.                     showCharCount(s);  
  280.   
  281.             }  
  282.   
  283.   
  284. 效果如下:  
  285.   
  286. 请输入待统计字符串:  Woden!Never give up!!!I'll do  my best!!!  
  287. 请输入40 个字符以内.  
  288. ===============================  
  289.   
  290. 请输入待统计字符串:  Woden!Never give up!!!  
  291. 原字符串是:Woden!Never give up!!!  
  292. 字符:  'p'     出现:   1   次  
  293. 字符:  'u'     出现:   1   次  
  294. 字符:  'i'     出现:   1   次  
  295. 字符:  'g'     出现:   1   次  
  296. 字符:  ' '     出现:   2   次  
  297. 字符:  'r'     出现:   1   次  
  298. 字符:  'v'     出现:   2   次  
  299. 字符:  'N'     出现:   1   次  
  300. 字符:  '!'     出现:   4   次  
  301. 字符:  'n'     出现:   1   次  
  302. 字符:  'e'     出现:   4   次  
  303. 字符:  'd'     出现:   1   次  
  304. 字符:  'o'     出现:   1   次  
  305. 字符:  'W'     出现:   1   次 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值