• Foundation Data Structure


    LinkedList :

    1. /**
    2. * 考虑的比较的周全,并且包含了全部的情况,代码也不乱<b></b>
    3. *
    4. * @param index
    5. * 插入的位置
    6. * @param c
    7. * 插入的元素集合
    8. */
    9. private boolean addAll(int index, Collection<? extends E> c) {
    10. // 缺少对于size的参数的校验
    11. Object[] a = c.toArray();
    12. int numNew = a.length;
    13. if (numNew == 0)
    14. return false;
    15. // 确定插入的位置和插入的前一个位置
    16. Node<E> pred, succ;
    17. if (index == size) {
    18. succ = null;
    19. pred = last;
    20. } else {
    21. succ = node(index);
    22. pred = succ.prev;
    23. }
    24. // 首先就是能够确认自己前面的一个节点是谁,size指的是插入的位置,后面的全部的一次
    25. // 向后移动
    26. for (Object o : a) {
    27. @SuppressWarnings("unchecked")
    28. E e = (E) o;
    29. Node<E> newNode = new Node<E>(pred, e, null);
    30. if (pred == null)
    31. first = newNode;
    32. else
    33. pred.next = newNode;
    34. pred = newNode;
    35. }
    36. // 把插入后面的元素接上
    37. if (succ == null) {
    38. last = pred;
    39. } else {
    40. pred.next = succ;
    41. succ.prev = pred;
    42. }
    43. size += numNew;
    44. return true;
    45. }
    46. /**
    47. * Returns the (non-null) Node at the specified element index. the alg is
    48. * interesting
    49. */
    50. private Node<E> node(int index) {
    51. if (index < (size >> 1)) {// 前半截,后半截
    52. Node<E> x = first;
    53. for (int i = 0; i < index; i++)
    54. x = x.next;
    55. return x;
    56. } else {
    57. Node<E> x = last;
    58. for (int i = size - 1; i > index; i--)
    59. x = x.prev;
    60. return x;
    61. }
    62. }
    add function 代码写的还是比较的精彩的:
    1. public boolean add(E e) {
    2. linkLast(e);
    3. return true;
    4. }
    5. /**
    6. * @param e
    7. */
    8. private void linkLast(E e) {
    9. // 尾节点,final ?
    10. final Node<E> l = last;
    11. final Node<E> newNode = new Node<E>(l, e, null);
    12. last = newNode;
    13. // special situation
    14. if (l == null)
    15. first = newNode;
    16. else
    17. l.next = newNode;
    18. size++;
    19. }
    20. /**
    21. * Inserts the specified element at the specified position in this list.
    22. * Shifts the element currently at that position (if any) and any subsequent
    23. * elements to the right (adds one to their indices).
    24. *
    25. * @param index
    26. * index at which the specified element is to be inserted
    27. * @param element
    28. * element to be inserted
    29. * @throws IndexOutOfBoundsException
    30. * {@inheritDoc}
    31. */
    32. public void add(int index, E element) {
    33. checkPositionIndex(index);
    34. if (index == size)
    35. linkLast(element);
    36. else
    37. linkBefore(element, node(index));
    38. }
    39. private void linkBefore(E element, Node<E> succ) {
    40. // assert succ != null;
    41. final Node<E> pred = succ.prev;
    42. final Node<E> insert = new Node<E>(pred, element, succ);
    43. succ.prev = insert;
    44. if (pred == null)
    45. first = insert;
    46. else
    47. pred.next = insert;
    48. size++;
    49. }
    50. private boolean isPositionIndex(int index) {
    51. return index >= 0 && index <= size;
    52. }
    53. private void checkPositionIndex(int index) {
    54. if (!isPositionIndex(index))
    55. throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    56. }
    57. private String outOfBoundsMsg(int index) {
    58. return "Index: " + index + ", Size: " + size;
    59. }






  • 相关阅读:
    AutoLISP圆内接多边形
    AutoLISP以直线为基线添加文字
    jquery easyuidatagrid 如何清空数据
    MyBatis直接执行SQL查询及批量插入数据
    mappers文件中的#{}语法与${}语法的区别
    在windows7桌面上新建一个快捷方式,指向cmd命令窗口
    ResultSet转换List或直接遍历解决null问题
    linux命令
    flash build 4.6 报错 内存不足,无法加载...
    关于linux安装openoffice无法启动
  • 原文地址:https://www.cnblogs.com/zhailzh/p/f6e49fa9e009d9332f84341249a5f2ed.html
Copyright © 2020-2023  润新知