A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苟苟 中级黑马   /  2015-5-1 20:25  /  469 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习完了集合容器,模仿实现了一个LinkedList.Jdk中的LinkedList是一个双向链表,增删改效率比较高,因为比较方便的获取前驱结点.
现在模仿使用的是单向链表.   现在贴上代码. 如有错误,请指正.

接口文件如下:
  1. /**
  2. * <p>Title: ILinearList.java</p>
  3. * <p>Copyright: Copyright (c) 2015</p>
  4. * @author possible
  5. * @version 1.0
  6. */
  7. package com.dt.linearlist;

  8. public interface ILinearList<T> {
  9. //        /**
  10. //         * 初始化线性表
  11. //         *
  12. //         * @return 返回线性表引用
  13. //         */
  14. //        public T initList();

  15.         /**
  16.          * 删除线性表
  17.          *
  18.          * @return 返回true 销毁成功 false失败
  19.          */
  20.         public void destoryList();

  21.         /**
  22.          * 判断线性表是否为空
  23.          *
  24.          * @return true 链表为空. false 链表不为空
  25.          */
  26.         public boolean isEmpty();

  27.         /**
  28.          * 线性表长度
  29.          *
  30.          * @return 链表长度
  31.          */
  32.         public int length();

  33.         /**
  34.          * 获取指定索引线性表结点
  35.          *
  36.          * @param index
  37.          *            获取index位置的元素
  38.          * @return 返回元素 T
  39.          */
  40.         public T get(int index);

  41.         /**
  42.          * 在指定位置插入元素
  43.          *
  44.          * @param i
  45.          *            插入位置的索引
  46.          * @param t
  47.          *            插入的元素
  48.          * @return true 插入成功, false 插入失败
  49.          */
  50.         public boolean add(int index, T t);

  51.         /**
  52.          * 删除指定索引的元素
  53.          *
  54.          * @param i
  55.          *            删除指定位置的元素
  56.          * @return true 删除成功; false 删除失败
  57.          */
  58.         public T delete(int index);

  59.         /**
  60.          * 线性表遍历
  61.          *
  62.          * @return 返回遍历结果
  63.          */
  64.         public String traverse();

  65.         /**
  66.          * 插入元素结点.
  67.          *
  68.          * @param t
  69.          *            插入结点
  70.          * @return true 插入成功 ; false 插入失败
  71.          */
  72.         public boolean add(T t);
  73. }
复制代码

实现类如下:
  1. /**
  2. * <p>Title: LinkedLinearList.java</p>
  3. * <p>Copyright: Copyright (c) 2015</p>
  4. * @version 1.0
  5. */
  6. package com.dt.linearlist;

  7. public class LinkedLinearList<T> implements ILinearList<T> {
  8.         private Node<T> header;
  9.         private Node<T> tailer;
  10.         private Node<T> pre;

  11.         private int length;

  12.         public LinkedLinearList() {
  13.                 header = new Node<T>();
  14.                 tailer = header;
  15.         }

  16.         /**
  17.          * 销毁单链表.
  18.          */
  19.         @Override
  20.         public void destoryList() {
  21.                 Node<T> node = header;
  22.                 while(header.next != null){
  23.                         header = header.next;
  24.                         node.next = null;
  25.                         node.item = null;
  26.                         node = header;
  27.                 }
  28.                
  29.                 length = 0;
  30.         }

  31.         /**
  32.          * 单链表是否为空
  33.          */
  34.         @Override
  35.         public boolean isEmpty() {
  36.                 return length() == 0;
  37.         }

  38.         /**
  39.          * 单链表的长度
  40.          */
  41.         @Override
  42.         public int length() {
  43.                 System.out.println("length = " + length);
  44.                 return length;
  45.         }

  46.         /**
  47.          * 获取指定索引出的Node
  48.          */
  49.         @Override
  50.         public T get(int index) {
  51.                 Node<T> node = getElement(index);
  52.                 System.out.println(node.item);
  53.                 return node.item;
  54.         }

  55.         /**
  56.          * 在指定索引位置添加Node
  57.          */
  58.         @Override
  59.         public boolean add(int index, T t) {
  60.                 if (!checkBounds(index)) {
  61.                         throw new ArrayIndexOutOfBoundsException(checkBoundsMsg(index));
  62.                 }

  63.                 Node<T> node = new Node<T>();
  64.                 node.item = t;
  65.                 Node<T> pointer = getElement(index);

  66.                 pre.next = node;
  67.                 node.next = pointer;
  68.                 increaseLength();
  69.                 return true;
  70.         }

  71.         /**
  72.          * 删除指定位置的索引Node
  73.          */
  74.         @Override
  75.         public T delete(int index) {
  76.                 Node<T> pointer = getElement(index);
  77.                 pre.next = pointer.next;
  78.                 // 剪断pointer.next的对下一个结点的引用;
  79.                 pointer.next = null;

  80.                 decreaseLength();
  81.                 return pointer.item;
  82.         }

  83.         /**
  84.          * 单链表遍历.
  85.          */
  86.         @Override
  87.         public String traverse() {
  88.                 StringBuffer sb = new StringBuffer();
  89.                 sb.append("开始遍历单链表");
  90.                 sb.append("\n");

  91.                 if (header.next == null) {
  92.                         sb.append("单链表无元素");
  93.                         sb.append("\n");
  94.                         sb.append("结束遍历单链表");

  95.                         return sb.toString();
  96.                 }

  97.                 Node<T> pointer = header.next;
  98.                 while (pointer != null) {
  99.                         sb.append(pointer.toString());
  100.                         sb.append("\n");
  101.                         pointer = pointer.next;
  102.                 }
  103.                 sb.append("结束遍历单链表");
  104.                 System.out.println(sb.toString());
  105.                 return sb.toString();
  106.         }

  107.         /**
  108.          * 单链表添加元素.尾结点插入法
  109.          */
  110.         @Override
  111.         public boolean add(T t) {
  112.                 Node<T> node = new Node<T>();
  113.                 node.item = t;
  114.                 tailer.next = node;
  115.                 tailer = node;
  116.                 increaseLength();
  117.                 return true;
  118.         }

  119.         // 得到指定位置的索引结点.
  120.         private Node<T> getElement(int index) {
  121.                 if (!checkBounds(index)) {
  122.                         throw new ArrayIndexOutOfBoundsException(checkBoundsMsg(index));
  123.                 }

  124.                 int counter = 0;
  125.                 Node<T> pointer = header.next;
  126.                 // 删除index的前一个结点
  127.                 pre = header;
  128.                 while (pointer != null) {
  129.                         if (counter == index) {
  130.                                 break;
  131.                         }
  132.                         counter++;
  133.                         // 未找到对应的索引,继续向下查找
  134.                         pre = pre.next;
  135.                         pointer = pointer.next;
  136.                 }
  137.                 return pointer;
  138.         }

  139.         /*
  140.          * 添加元素,链表长度增加1
  141.          */
  142.         private void increaseLength() {
  143.                 length++;
  144.         }

  145.         /*
  146.          * 删除元素,链表长度减1
  147.          */
  148.         private void decreaseLength() {
  149.                 length--;
  150.         }

  151.         private String checkBoundsMsg(int index) {
  152.                 if (index >= length) {
  153.                         return "下标越界   " + " length: " + length + " index: " + index;
  154.                 }
  155.                 return null;
  156.         }

  157.         /**
  158.          * 检查指定的索引是否越界
  159.          *
  160.          * @param index
  161.          * @return
  162.          */
  163.         private boolean checkBounds(int index) {
  164.                 return index >= 0 && index < length;
  165.         }

  166.         /**
  167.          * 单链表结点
  168.          *
  169.          * @author possible
  170.          *
  171.          */
  172.         private static class Node<T> {
  173.                 /**
  174.                  * 下一个结点引用
  175.                  */
  176.                 Node<T> next;

  177.                 /**
  178.                  * 存储的对象
  179.                  */
  180.                 T item;

  181.                 @Override
  182.                 public String toString() {
  183.                         return "Node [" + " item=" + item + "]";
  184.                 }
  185.         }
  186. }
复制代码




1 个回复

倒序浏览
没有人赞, 我自己默默赞一下吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马