• 单向链表的实现


      单链表结构:物理存储结构上不连续,逻辑上连续,大小不固定。

      单链表主要是以一个个节点组成,结点中又包含了两个域:1.存储数据的数据域 2.存储指针的指针域(java是以一个变量存储下一个结点的内存地址)

      

      单链表插入操作:

      s.next=p.next;

      p.next=s;(注意插入的顺序)

      

      单链表的删除操作:

       ....----->p(结点)------>z(结点)------>.....

      如果要删除Z结点

      p.next=z.next;

      

      1.结点类

    1 public class ListNode {
    2      Object data;
    3      ListNode next;
    4     
    5     public ListNode(Object element)
    6     {
    7         this.data=element;
    8     }
    9 }

      2.MyList接口

     1 public interface MyList<T>{
     2     //新增一个元素
     3     void add(T element);
     4     //删除与输入元素相同的元素
     5     void delete(T element);
     6     //根据索引删除元素
     7     void delete(int index);
     8     //更新元素
     9     void update(int index,T newelement);
    10     //三种查询方法
    11     boolean contains(T element);
    12     
    13     T at(int index);
    14     
    15     int indexOf(T element);
    16 }

      3.SingleLinkedList类

      1 public class SingleLinkedList<T> implements MyList<T>{
      2     private ListNode first;
      3     private ListNode last;
      4     private int size=0;
      5     
      6     @Override
      7     public void add(T element) {
      8         if(first==null)
      9         {
     10             first=new ListNode(element);
     11             last=first;
     12         }else {
     13             last.next=new ListNode(element);
     14             last=last.next;
     15         }
     16         size++;
     17     }
     18 
     19     @Override
     20     public void delete(T element) {
     21         ListNode p=first;
     22         ListNode pre=null;
     23         while(p!=null)
     24         {
     25             if(p.data.equals(element))
     26             {
     27                 if(p==first)
     28                 {
     29                     first=first.next;//first等于first的下一个结点
     30                 }
     31                 else
     32                 {
     33                     pre.next=p.next;//相等结点的前驱结点的指针指向该结点的后驱结点
     34                 }
     35                 size--;
     36                 break;
     37             }
     38             pre=p;
     39             p=p.next;
     40         }
     41     }
     42 
     43     @Override
     44     public void delete(int index) {
     45         int i=0;//计数
     46         ListNode p=first;
     47         ListNode pre=null;
     48         while(p!=null)
     49         {
     50             if(i==index)
     51             {
     52                 if(p==first)
     53                     first=first.next;
     54                 else
     55                     pre.next=p.next;
     56                 size--;
     57                 break;
     58             }
     59             pre=p;
     60             p=p.next;
     61             i++;
     62         }
     63         
     64     }
     65 
     66     @Override
     67     public void update(int index, T newelement) {
     68         if(index>=size&&index<0)
     69             return ;
     70         int i=0;//计数
     71         ListNode p=first;
     72         while(p!=null)
     73         {
     74             if(index==i)
     75             {
     76                 p.data=newelement;
     77                 break;
     78             }
     79             p=p.next;
     80             i++;
     81         }
     82         
     83     }
     84 
     85     @Override
     86     public boolean contains(T element) {
     87         ListNode p=first;
     88         while(p!=null)
     89         {
     90             if(p.data.equals(element))
     91                 return true;
     92             p=p.next;
     93         }
     94         return false;
     95     }
     96 
     97     @Override
     98     public T at(int index) {
     99         if(index>=size&&index<0)
    100             return null;
    101         int i=0;//计数
    102         ListNode p=first;
    103         while(p!=null)
    104         {
    105             if(index==i)
    106             {
    107                 return (T) p.data;
    108             }
    109             p=p.next;
    110             i++;
    111         }
    112         return null;
    113     }
    114 
    115     @Override
    116     public int indexOf(T element) {
    117         int i=0;
    118         ListNode p=first;
    119         while(p!=null)
    120         {
    121             if(p.data.equals(element))
    122             {
    123                 return i;
    124             }
    125             p=p.next;
    126             i++;
    127         }
    128         return -1;
    129     }
    130     
    131     @Override
    132     public String toString()
    133     {
    134         StringBuilder sb=new StringBuilder("[");
    135         ListNode p=first;
    136         while(p!=null)
    137         {
    138             sb.append(p.data);
    139             if(p.next!=null)
    140                 sb.append(",");
    141             p=p.next;
    142         }
    143         sb.append("]");
    144         return sb.toString();
    145     }
    146     
    147     public int getSize()
    148     {
    149         return size;
    150     }
    151 
    152 }

      

      顺序表和单链表的比较:

    顺序表:

      优点:主要优点是支持随机读取,以及内存空间利用效率高;

      缺点:主要缺点是需要预先给出数组的最大数据元素个数,而这通常很难准确作到。当实际的数据元素个数超过了预先给出的个数,会发生异常。另外,顺序表插入和删除操作时需要移动较多的数据元素。

    单链表:

      优点:主要优点是不需要预先给出数据元素的最大个数。另外,单链表插入和删除操作时不需要移动数据元素;

      缺点:主要缺点是每个结点中要有一个指针,因此单链表的空间利用率略低于顺序表的。另外,单链表不支持随机读取,单链表取数据元素操作的时间复杂度为O(n);而顺序表支持随机读取,顺序表取数据元素操作的时间复杂度为O(1)。

      

  • 相关阅读:
    Eclipse常用插件推荐
    Open Source Search Engines in Java
    Java: convert a file to a byte array, then convert byte array to a file.
    常用的Eclipse插件介绍
    一个搜索引擎周边的blog
    java文件读取。(单字节读取和按行读取读取)
    im4java
    csv格式读取通用类
    java以流方式下载文件struts2.x版_心灵的港湾_百度空间
    Jetty/Feature/Jetty Maven Plugin
  • 原文地址:https://www.cnblogs.com/LgxBoKeYuan/p/10175680.html
Copyright © 2020-2023  润新知