title: 【学习之路】LinkedList封装
draft: true
tags:


首先新建一个类为LinkedBox


创建静态一个内部类Node

定义三个属性,并且通过构造方法进行初始化

  1. private static class Node{
  2. //首节点
  3. private Node<E> prev;
  4. //元素
  5. private E item;
  6. //尾结点
  7. private Node<E> next;
  8. public Node(Node<E> prev, E item, Node<E> next){
  9. this.prev = prev;
  10. this.item = item;
  11. this.next = next;
  12. }
  13. }

在LinkedBox类中定义三个属性

  1. public class LinkedBox<E>{
  2. //首节点
  3. private Node<E> first;
  4. //尾结点
  5. private Node<E> last;
  6. //有效元素个数
  7. private int size;
  8. }

LinkedBox添加方法

  1. public boolean add(E e){
  2. linklast(e);
  3. return true;
  4. }
  5. private void linklast(E e){
  6. Node<E> l = last;
  7. //l将尾结点给当前添加元素作为首节点
  8. //e为当前添加的元素
  9. //null表示添加在链表末尾,末尾没有元素先设置为空
  10. Node<E> newNode = new Node<E>(l, e, null);
  11. //当前链表的尾结点给last
  12. last = newNode;
  13. //判断尾结点是否为空,如果为空代表newNode就是首节点,当前元素也是首节点
  14. if (l == null)
  15. first = newNode;
  16. else
  17. //如果不是首节点,就把newNode给上一个元素的尾结点
  18. l.next = newNode;
  19. //有效元素个数加1
  20. size++;
  21. }

LinkedBox删除方法

  1. public E remove(int index){
  2. //开始方法前先判断index是否合法
  3. indexException(index);
  4. return unlike(node(index));
  5. }
  6. //新建一个类定义一个异常
  7. public class BoxIndexOutOfBoundsException extends RuntimeException{
  8. public BoxIndexOutOfBoundsException(){}
  9. public BoxIndexOutOfBoundsException(String msg){
  10. super(msg);
  11. }
  12. }
  13. //用来判断index是否越界
  14. private void indexException(int index){
  15. if (index < 0 || index > size - 1){
  16. throw new BoxIndexOutOfBoundsException("Index:"+ index +",Size:"+ size);
  17. }
  18. }
  19. //用来查找index的位置
  20. private Node<E> node(int index){
  21. //判断index是否小于size / 2如果小于从前面开始找index的值,不小于从后面找index的值
  22. if (index < (size >> 1)){
  23. Node<E> x = first;
  24. for (int i = 0; i < index; i++){
  25. x = x.next;
  26. }
  27. //返回当前对象
  28. return x;
  29. }else {
  30. Node<E> x = last;
  31. for (int i = size - 1; i > index; i--){
  32. x = x.prev;
  33. }
  34. //返回当前对象
  35. return x;
  36. }
  37. }
  38. //删除前后的node链接
  39. private E unlink(Node<E> x){
  40. //先将查找到的node对象分别存储
  41. E elemet = x.item;
  42. Node Node<E> = x.prev;
  43. Node Node<E> = x.next;
  44. //判断当前对象首节点是否为空,如果为空那么代表删除的元素是第一个元素
  45. if (prev == null){
  46. //将下一个node对象给first
  47. first = next;
  48. }else {
  49. //把尾结点对象给上一个节点的尾结点
  50. prev.next = next;
  51. x.prev = null;
  52. }
  53. //判断当前对象是否为空,如果为空那么代表删除的元素是最后一个元素
  54. if (next == null){
  55. //将上一个对象node给last
  56. last = prev;
  57. }else {
  58. //把当前删除对象的首节点给下一个对象的首节点
  59. next.prev = prev;
  60. x.next = null;
  61. }
  62. x.item = null;//清空当前元素
  63. size--;//将有效元素个数减少一个
  64. return elemet;
  65. }

LinkedBox修改方法

  1. public boolean upDate(int index, E value){
  2. //先判断index是否合法
  3. indexException(index);
  4. node(index).item = value;
  5. return true;
  6. }
  7. //用node方法来查找元素
  8. private Node<E> node(int index){
  9. //判断index是否小于size / 2如果小于从前面开始找index的值,不小于从后面找index的值
  10. if (index < (size >> 1)){
  11. Node<E> x = first;
  12. for (int i = 0; i < index; i++){
  13. x = x.next;
  14. }
  15. //返回当前对象
  16. return x;
  17. }else {
  18. Node<E> x = last;
  19. for (int i = size - 1; i > index; i--){
  20. x = x.prev;
  21. }
  22. //返回当前对象
  23. return x;
  24. }
  25. }

LinkedBox查询方法

  1. public E getElementDate(int index) {
  2. //先判断index是否合法
  3. indexException(index);
  4. return node(index).item;
  5. }
  6. //调用node方法查询元素
  7. private Node<E> node(int index){
  8. //判断index是否小于size / 2如果小于从前面开始找index的值,不小于从后面找index的值
  9. if (index < (size >> 1)){
  10. Node<E> x = first;
  11. for (int i = 0; i < index; i++){
  12. x = x.next;
  13. }
  14. //返回当前对象
  15. return x;
  16. }else {
  17. Node<E> x = last;
  18. for (int i = size - 1; i > index; i--){
  19. x = x.prev;
  20. }
  21. //返回当前对象
  22. return x;
  23. }
  24. }