Java数据结构之链表(动力节点之Java学院整理)

单链表:

insertFirst:在表头插入一个新的链接点,时间复杂度为O(1)

deleteFirst:删除表头的链接点,时间复杂度为O(1)

find:查找包含指定关键字的链接点,由于需要遍历查找,平均需要查找N/2次,即O(N)

remove:删除包含指定关键字的链接点,由于需要遍历查找,平均需要查找N/2次,即O(N)

public class LinkedList {
   private class Data{
     private Object obj;
     private Data next = null;
     Data(Object obj){
       this.obj = obj;
     }
   }
   private Data first = null; 

   public void insertFirst(Object obj){
     Data data = new Data(obj);
     data.next = first;
     first = data;
   }
   public Object deleteFirst() throws Exception{
     if(first == null)
       throw new Exception("empty!");
     Data temp = first;
     first = first.next;
     return temp.obj;
   }
   public Object find(Object obj) throws Exception{
     if(first == null)
       throw new Exception("LinkedList is empty!");
     Data cur = first;
     while(cur != null){
       if(cur.obj.equals(obj)){
         return cur.obj;
       }
       cur = cur.next;
     }
     return null;
   }
   public void remove(Object obj) throws Exception{
     if(first == null)
       throw new Exception("LinkedList is empty!");
     if(first.obj.equals(obj)){
       first = first.next;
     }else{
       Data pre = first;
       Data cur = first.next;
       while(cur != null){
         if(cur.obj.equals(obj)){
           pre.next = cur.next;
         }
        pre = cur;
         cur = cur.next;
       }
     }
   }
   public boolean isEmpty(){
     return (first == null);
   }
   public void display(){
     if(first == null)
       System.out.println("empty");
     Data cur = first;
     while(cur != null){
       System.out.print(cur.obj.toString() + " -> ");
       cur = cur.next;
     }
     System.out.print("\n");
   }
   public static void main(String[] args) throws Exception {
     LinkedList ll = new LinkedList();
     ll.insertFirst(4);
     ll.insertFirst(3);
     ll.insertFirst(2);
     ll.insertFirst(1);
     ll.display();
     ll.deleteFirst();
     ll.display();
     ll.remove(3);
     ll.display();
     System.out.println(ll.find(1));
     System.out.println(ll.find(4));
   }
 } 
 1 -> 2 -> 3 -> 4 ->
 2 -> 3 -> 4 ->
 2 -> 4 ->
 null
 4 

双端链表(不是双向链表):

与单向链表的不同之处在保存有对最后一个链接点的引用(last)

insertFirst:在表头插入一个新的链接点,时间复杂度O(1)

insertLast:在表尾插入一个新的链接点,时间复杂度O(1)

deleteFirst:删除表头的链接点,时间复杂度O(1)

deleteLast::删除表尾的链接点,由于只保存了表尾的链接点,而没有保存表尾的前一个链接点(这里就体现出双向链表的优势了),所以在删除表尾链接点时需要遍历以找到表尾链接点的前一个链接点,需查找N-1次,也就是O(N)
有了这几个方法就可以用双端链表来实现一个队列了

 public class FirstLastList {
   private class Data{
     private Object obj;
     private Data next = null;
     Data(Object obj){
       this.obj = obj;
     }
   }
   private Data first = null;
   private Data last = null;
   public void insertFirst(Object obj){
     Data data = new Data(obj);
     if(first == null)
       last = data;
     data.next = first;
     first = data;
   }
   public void insertLast(Object obj){
     Data data = new Data(obj);
     if(first == null){
       first = data;
     }else{
       last.next = data;
     }
     last = data;
   }
   public Object deleteFirst() throws Exception{
      if(first == null)
       throw new Exception("empty");
      Data temp = first;
      if(first.next == null)
       last = null;
      first = first.next;
      return temp.obj;
  }
   public void deleteLast() throws Exception{
     if(first == null)
       throw new Exception("empty");
     if(first.next == null){
       first = null;
       last = null;
     }else{
       Data temp = first;
       while(temp.next != null){
         if(temp.next == last){
           last = temp;
           last.next = null;
           break;
        }
        temp = temp.next;
      }
     }
   }
   public void display(){
     if(first == null)
       System.out.println("empty");
     Data cur = first;
     while(cur != null){
       System.out.print(cur.obj.toString() + " -> ");
       cur = cur.next;
     }
     System.out.print("\n");
   }
   public static void main(String[] args) throws Exception {
     FirstLastList fll = new FirstLastList();
     fll.insertFirst(2);
     fll.insertFirst(1);
     fll.display();
     fll.insertLast(3);
     fll.display();
     fll.deleteFirst();
     fll.display();
     fll.deleteLast();
     fll.display();
   }
 } 
 1 -> 2 ->
 1 -> 2 -> 3 ->
 2 -> 3 ->
 2 -> 

有序链表:

链表中的数据按从小到大排列

public class SortedList {
   private class Data{
     private Object obj;
     private Data next = null;
     Data(Object obj){
       this.obj = obj;
     }
   }
   private Data first = null;
   public void insert(Object obj){
     Data data = new Data(obj);
     Data pre = null;
     Data cur = first;
     while(cur != null && (Integer.valueOf(data.obj.toString())
        .intValue() > Integer.valueOf(cur.obj.toString())
         .intValue())){
       pre = cur;
      cur = cur.next;
     }
     if(pre == null)
       first = data;
     else
       pre.next = data;
     data.next = cur;
   }
   public Object deleteFirst() throws Exception{
     if(first == null)
       throw new Exception("empty!");
     Data temp = first;
     first = first.next;
     return temp.obj;
   }
   public void display(){
     if(first == null)
       System.out.println("empty");
     System.out.print("first -> last : ");
     Data cur = first;
     while(cur != null){
       System.out.print(cur.obj.toString() + " -> ");
       cur = cur.next;
     }
     System.out.print("\n");
   }
   public static void main(String[] args) throws Exception{
     SortedList sl = new SortedList();
     sl.insert(80);
     sl.insert(2);
     sl.insert(100);
     sl.display();
     System.out.println(sl.deleteFirst());
     sl.insert(33);
     sl.display();
     sl.insert(99);
     sl.display();
   }
 } 
 first -> last : 2 -> 80 -> 100 ->
 2
 first -> last : 33 -> 80 -> 100 ->
 first -> last : 33 -> 80 -> 99 -> 100 -> 

表的插入和删除平均需要比较N/2次,即O(N),但是获取最小数据项只需O(1),因为其始终处于表头,对频繁操作最小数据项的应用,可以考虑使用有序链表实现,如:优先级队列和数组相比,链表的优势在于长度不受限制,并且在进行插入和删除操作时,不需要移动数据项,故尽管某些操作的时间复杂度与数组想同,实际效率上还是比数组要高很多。劣势在于随机访问,无法像数组那样直接通过下标找到特定的数据项 。

以上所述是小编给大家介绍的Java数据结构之链表(动力节点之Java学院整理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Java数据结构之简单链表的定义与实现方法示例

    本文实例讲述了Java数据结构之简单链表的定义与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 只有一个数据项(链接点Link),每个数据插入时都是对第一个数据的引用. 2.插入数据说明: 当链表没有数据时,插入的值就是第一个数据,如果链表里有数据,就把当前的数据的next指针指向第一个数据. 3.插入数据图: 4.特点:先进后出 5.实现功能: 数据插入,指定位置插入,显示,查询,删除等 6.删除原理 7.插入头节点原理 二.实现: 1.创建节点 /** * @描述 节点

  • Java模拟单链表和双端链表数据结构的实例讲解

    模拟单链表 线性表: 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的. 线性表的逻辑结构简单,便于实现和操作. 在实际应用中,线性表都是以栈.队列.字符串等特殊线性表的形式来使用的. 线性结构的基本特征为: 1.集合中必存在唯一的一个"第一元素": 2.集合中必存在唯一的一个 "最后元素" : 3.除最后一个元素之外,均有 唯一的后继(后件):

  • java数据结构之实现双向链表的示例

    复制代码 代码如下: /** * 双向链表的实现 * @author Skip * @version 1.0 */public class DoubleNodeList<T> { //节点类 private static class Node<T>{  Node<T> perv;  //前节点  Node<T> next;  //后节点  T data;    //数据 public Node(T t){   this.data = t;  } } priv

  • Java模拟有序链表数据结构的示例

    有序链表: 按关键值排序.删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时需要比较O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 如果一个应用需要频繁的存取(插入/查找/删除)最小(/最大)的数据项,那么有序链表是一个不错的选择 优先级队列 可以使用有序链表来实现 有序链表的插入排序: 对一个无序数组,用有序链表来排序,比较的时间级还是O(N^2) 复制时间级为O(2*N),因为复制的次数较少,第一次放进链表数据移动N次,再从链表复制到数组,

  • JAVA 数据结构链表操作循环链表

    JAVA 链表操作:循环链表 主要分析示例: 一.单链表循环链表 二.双链表循环链表 其中单链表节点和双链表节点类和接口ICommOperate<T>与上篇一致,这里不在赘述.参考:JAVA链表操作:单链表和双链表http://www.jb51.net/article/95113.htm 一.单链表循环链表 package LinkListTest; import java.util.HashMap; import java.util.Map; public class SingleCycle

  • java实现数据结构单链表示例(java单链表)

    复制代码 代码如下: /** * 单向链表 * */public class NodeList<E> { private static class Node<E> { // 节点类  E data; // 节点上的数据  Node<E> next; // 指向下一个节点 Node(E e) {   this.data = e;   this.next = null;  } } private Node<E> head; // 链表的头节点 private N

  • 详解java数据结构与算法之双链表设计与实现

    在单链表分析中,我们可以知道每个结点只有一个指向后继结点的next域,倘若此时已知当前结点p,需要查找其前驱结点,那么就必须从head头指针遍历至p的前驱结点,操作的效率很低,因此如果p有一个指向前驱结点的next域,那效率就高多了,对于这种一个结点中分别包含了前驱结点域pre和后继结点域next的链表,称之为双链表.本篇我们将从以下结点来分析双链表 双链表的设计与实现 双链表的主要优点是对于任意给的结点,都可以很轻易的获取其前驱结点或者后继结点,而主要缺点是每个结点需要添加额外的next域,因

  • Java数据结构之双端链表原理与实现方法

    本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果为空则设置尾节点为新添加的节点 3.从尾部进行插入 如果链表为空,则直接设置头节点为新添加的节点,否则设置尾节点的后一个节点为新添加的节点 4.从头部删除 判断节点是否有下个节点,如果没有则设置节点为null 二.具体实现 /** * @描述 头尾相接的链表 * @项目名称 Java_DataStr

  • java 数据结构单链表的实现

    java 数据结构单链表的实现 单链表实现链表的打印及元素删除操作,链表的实现主要是next属性的定义,将一堆节点关联起来的.实现简单的链表如下: public class LinkNode { private int value; private LinkNode next; public LinkNode(int x) { value = x; } public LinkNode getNext(){ return next; } public void setNext(LinkNode n

  • java 数据结构之删除链表中的元素实例代码

    java 删除链表中的元素 以下实例演示了使用 Clear() 方法来删除链表中的元素: import java.util.*; public class Main { public static void main(String[] args) { LinkedList<String> lList = new LinkedList<String>(); lList.add("1"); lList.add("8"); lList.add(&q

  • Java 数据结构链表操作实现代码

    链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表.循环链表.双向链表,下面将逐一介绍.链表在数据结构中是基础,也是重要的知识点,这里讲下Java 中链表的实现, JAVA 链表操作:单链表和双链表 主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个链

随机推荐