zoukankan      html  css  js  c++  java
  • java实现链表模拟LinkedList类

    LinkedList类底层数据结构

    模拟:

      1 package Collection;
      2 
      3 public class MyLinkedList {
      4     Node first;
      5     Node last;
      6     private int size;
      7     public MyLinkedList(){
      8         
      9     }
     10     /*
     11      * 添加一个新对象
     12      * */
     13     public boolean add(Object obj){
     14         Node node = new Node();
     15         if(first == null){
     16             first = node;
     17             last = node;
     18             node.prev = null;
     19             node.next = null;
     20             node.obj = obj;
     21         }else{
     22             node.prev = last;//下一个关联上一个
     23             node.next = null;
     24             node.obj = obj;
     25             last.next = node;//上一个关联下一个
     26             last = node;
     27         }
     28         size++;
     29         return true;
     30     }
     31     /*
     32      * 在index处添加一个新元素,作为index对应的元素
     33      * */
     34     public boolean add(int index, Object obj){
     35         checkBound(index);
     36         Node node = this.first;
     37         Node nodeTemp = new Node();
     38         if(index == 0){
     39             nodeTemp.obj = obj;
     40             nodeTemp.prev = null;
     41             nodeTemp.next = this.first;
     42             this.first.prev = nodeTemp;
     43             this.first = nodeTemp;
     44             size++;
     45         }else if(index == size - 1){
     46             add(obj);
     47             size++;
     48         }else{
     49             nodeTemp.obj = obj;
     50             for(int i = 0; i < index; i++)
     51                 node = node.next;
     52             nodeTemp.next = node;
     53             nodeTemp.prev = node.prev;
     54             node.prev.next = nodeTemp;
     55             node.prev = nodeTemp;
     56             size++;
     57         }
     58         return true;
     59     }
     60     /*
     61      * 获得元素个数
     62      * */
     63     public int size(){
     64         return this.size;
     65     }
     66     /*
     67      * 按照index获得元素
     68      * */
     69     public Object get(int index){
     70         checkBound(index);
     71         Node node = this.first;
     72         for(int i = 0; i < index; i++)
     73             node = node.next;
     74         if(node != null)
     75             return node.obj;
     76         else
     77             return null;            
     78     }
     79     /*
     80      * 移除index处的元素
     81      * */
     82     public boolean remove(int index){
     83         checkBound(index);
     84         Node node = this.first;
     85         if(index == 0){
     86             this.first = this.first.next;
     87             size--;
     88         }else if(index == size - 1){
     89             for(int i = 0; i < index; i++)
     90                 node = node.next;
     91             node.prev.next = null;
     92             size--;
     93         }else{
     94             for(int i = 0; i < index; i++)
     95                 node = node.next;
     96             node.prev.next = node.next;
     97             node.next.prev = node.prev;
     98             size--;
     99         }
    100         return true;
    101     }
    102     /*
    103      * 移除obj对象
    104      * */
    105     public boolean remove(Object obj){
    106         remove(indexOf(obj));
    107         return true;
    108     } 
    109     /*
    110      * 检索对象obj,返回index
    111      * */
    112     private int indexOf(Object obj){
    113         Node node = this.first;
    114         for(int i = 0; i < this.size; i++){
    115             if(node.obj.equals(obj))
    116                 return i;
    117             node = node.next;
    118         }
    119         return -1;
    120     }
    121     /*
    122      * 倒序检索
    123      * */
    124     public int lastIndexof(Object obj){
    125         Node node = this.last;
    126         for(int i = 0; i < this.size; i++){
    127             if(node.obj.equals(obj))
    128                 return size - i - 1;
    129             node = node.prev;
    130         }
    131         return -1;
    132     }
    133     /*
    134      * 检查边界
    135      * */
    136     private void checkBound(int index){
    137         if(index < 0 || index > this.size)
    138             try {
    139                 throw new Exception();
    140             } catch (Exception e) {
    141                 // TODO Auto-generated catch block
    142                 e.printStackTrace();
    143             }
    144     }
    145 }
    146 /*
    147  * Node类
    148  * */
    149 class Node{
    150     Node prev;
    151     Node next;
    152     Object obj;
    153     public Node(){
    154         
    155     }
    156 }
  • 相关阅读:
    VC++实现感染文件式加载DLL文件
    vC++实现遍历桌面和快速启动里的所有快捷方式,判断快捷方式是不是浏览器,如果是则删除快捷方式参数
    VC++另类实现进程插入
    云服务系列:Windows Azure SDK for .NET(2012 年 6 月发布的版本)的最新消息
    VC++1.5K字节实现下载并远程注入
    上海求职指南 (最新版)
    WinAPI: GetWindowText 获取窗口标题
    WinAPI: SetCursorPos 设置鼠标指针位置
    WinAPI: SetComputerName 更改计算机名称
    GDI+ 学习记录(31): 图像颜色变换(TGPImageAttributes)
  • 原文地址:https://www.cnblogs.com/cxy2016/p/7127119.html
Copyright © 2011-2022 走看看