`
19941021
  • 浏览: 5388 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • ayaome: ...
    java
  • 19941021:     明白了!谢谢了!
    java
  • ayaome: head属于LinkList类的属性你加个static关键字, ...
    java
  • 19941021:      这是因为在主函数中调用遍历链表的方法时要传入链表头的 ...
    java
  • ayaome: public static LinkNode head=nul ...
    java
阅读更多
[b][/b][color=green][/color][size=large][/size]     首先和大家分享一下为何要引入链表,其和我们所熟知的数组有何异同。
      如果大家再能补充一下,我将不胜感激。
                         数组与链表的联系与区别
      数据结构:线性结构,树状结构,网状结构,集合。 
      数据的存储结构: 顺序存储,链接存储  
                                                    
      联系:两者都是用来存储数据,而且体现出数据之间的联系。
      区别:
               数组中的数据都是顺序存储,只适合处理线性结构,而链表为链接存储,可以处理四种结构的数据
       
               顺序存储结构(数组)的优缺点:
                      优点:逻辑上相邻的元素,物理位置也是连续的(静态存储),因此表示方法简单直观,利用下标可随机访问结构
                              中的任何元素
                      缺点:(1)要求存储空间连续,这样对于分散的空间难于利用
                (2)数组的长度是固定的,分配空间按最大数据长度,这样容易导致空间浪费,有时也会出现长度小数据溢出
                (3)对数组中的元素进行插入或删除时,需要把插入或删除后的点的数据进行移动,很麻烦
                链接存储结构(链表)的优缺点:
                     优点:(1)逻辑上相邻的元素,物理位置不需要连续(动态存储),利用指针属性来表示数据之间的逻辑关系
                              提高空间的利用率
               (2)不是一次性为所有数据元素分配空间,而是以结点为单位,动态的为每一个结点分配空间
               (3)对链表存储的元素进行插入或删除时不需要把它后面的点都移动,变动小
                    缺点:(1)链表是由结点组成的非连续的数据结构,结点通过指针相连,访问时需要从链表头开始访问
                                  因此不能随机访问每一个结点,不适合进行大量的数据查找
               (2)数据属性较简单时,每个指针属性的存储占用空间大

    链表以结点为单位构成(数据和指针);
    链表有单链表,双链表,循环链表之分:
  
    下面是三者的图示有助于大家理解:
    单链表:[img][/img]
        


    双向链表:[img][/img]
    


    循环链表:[img][/img]
     


    这里我先说一下单链表:

     //单链表结点类:
   


    public class Node { //定义结点类
Object num,name,score;  //结点中的数据属性
Node next;    //结点中指针的属性,指向下一个Node对象的引用
public Node(Object obj1,Object obj2,Object obj3){
num=obj1; name=obj2;score=obj3;next=null;
}
    }
   
    //单链表队列的创建
    


    public class List { 
Node head,tail; //定义表头结点与表尾结点对象的引用名
String  Lname; //定义链表名
    //构造方法,创建一个空链表时对头,尾结点及链表名赋值
public List(String str){
Lname=str;head=null;tail=null;
}
//若用户没给链表对象名,List作为默认名
public List(){
Lname="List";head=null;tail=null;
}
/**
* @param 添加结点n到链表头部
*
*/
public void appendToFront(Node n){
if(head==null){
head=n;tail=n;  //链表为空,添加第一个结点到链表中
}else{
n.next=head; head=n;
}
}
/**
* @param 添加节点n到链表尾部
*
*/
public void appendToTail(Node n){
if(head==null){
head=n;tail=n;  //链表为空,添加第一个结点到链表中
}else{
tail.next=n; tail=n;
}
}

/**
* @param 遍历整个链表
*
*/
public void visitAllNode(){
Node p=head; //设p为head结点的引用
System.out.println(this.Lname);
if(p==null)  System.out.println("该链表为空链表");
else
while(true)
{
System.out.println(p.num.toString()+"\t"+p.name.toString()+"\t"+p.score.toString()
+"->");
if(p.next==null)  break;  //再没有需要访问的结点
p=p.next;  //设p为下一个结点的引用
}
}
/**
* @param i:得到的结点索引
*
*/
public Node getNode(int i){
//查找链表中第i个结点
Node p=head; int j=1;  //设p为head结点的引用
while(j<i){
if(p.next==null) break;
p=p.next;// 扫描下一个结点
j++;
}
if(j==i)  return p;
else{
System.out.println("链表中不存在第+“i"+"个结点");
return null;
}

}

/**
* @param 查找链表中第j个数据属性的值为obj的结点
*
*/
public Node getNode(Object obj,int j){
Node p=head; j=1;  //设p为head结点的引用
if(j==1||j==2||j==3)
while(p!=null){
if(j==1){
if(p.num.equals(obj)) break;
}
if(j==2){
if(p.num.equals(obj)) break;
}
if(j==3){
if(p.num.equals(obj)) break;
}
}
else  p=null;
if(p==null)  System.out.println("查找无第"+j+"个数据属性值为"+obj+"的结点");
return p;
}
/**
* @param k:查找其前趋借点
*
*/
public Node getPreNode(Node k){
//查找链表中k结点的前趋结点
Node p=head,pre=head; //查找开始时,设p与pre都是head的引用
if(k==p||p==null){    //空链表或只有一个结点的链表均无前趋结点
System.out.println("链表中无此结点");
return null;
}else{
while(k!=p){
if(p.next==null) break;
pre=p;p=p.next;
}
if(k==p)  return pre;
else{
System.out.println("链表中"+k+"结点前无结点");
return null;
}
}

}
/**
* @param i:在指定索引下插入对象
*
*/
public void insert(Node n,int i){
//添加结点n到链表中第i个结点之后
Node p=getNode(i);
if(p!=null)
if(p.next==null){  //插入的结点n为链表尾结点
p.next=n;tail=n;
}else{
n.next=p.next;p.next=n;  //插入结点n到链表p结点之后
}
}
public void insert(Node n,Object obj,int j){
//添加结点n到链表中第j个数据属性的值为obj的结点之后
Node p=getNode(obj,j);
if(p!=null)
if(p.next==null){
p.next=n;tail=n;
}else{
n.next=p.next;p.next=n;  //插入结点n到链表p结点之后
}
}
/**
* @param i:在指定索引下删除对象
*
*/
public void delete(int i){
Node p=getNode(i),pre=null;   //得到i结点
if(p!=null){
if(i==1)
if(p.next!=null)
head=p.next;    //删除第一个结点
else head=tail=null;  //设此链为空链
else{
pre=getPreNode(p);  //得到i结点的前趋结点
if(p.next==null){
pre.next=null;tail=pre;
}else
pre.next=p.next;  //结点为中间结点,被删除
}
}


}
public void delete(Object obj,int j){
//删除链表中第j个数据属性的值我为obj的结点
Node p=getNode(obj,j),pre=null;  //得到第j个数据属性的值为obj的结点p
if(p!=null){
if(p==head)
if(p.next!=null)
head=p.next;
else head=tail=null;
else{
pre=getPreNode(p);
if(p.next==null){
pre.next=null;tail=pre;
}
else pre.next=p.next;
}
}
}
public void deleteAll(){
//删除链表中的所有结点,使链表为空
head=null;tail=null;
}
/**
* @param i:在指定索引下修改对象
*
*/
public void updateNode(int i,Object obj,int j){
Node p=getNode(i);    //得到第i个结点
if(p==null)  System.out.println("无第"+j+"个结点");
else
switch(j){  //根据j值修改数据属性值为obj
case 1:  p.num=obj;break;
case 2:  p.name=obj;break;
case 3:  p.score=obj;break;
default:  System.out.println("无第"+j+"个数据属性,不修改");
}
}
public List listSort(int j){
/**
* 对链表中的结点从小到大进行排序
* 使用插入法对链表中的结点按第j个数据属性值从小到大排序
*/
List f2=new List("f2list");
if(head==null)   return f2;
if(j==1||j==2||j==3){
System.out.println("需要排序的链表是:"+Lname);
//得到链表f1的第一个结点
Node pp=new Node(head.num,head.name,head.score);
if(head.next==null)
System.out.println("该链表是空链表或只有一个结点,不排序");
else{
Node f1p=head.next,f2p=null;  //f1p为链表f1结点的引用
f2.appendToFront(pp);  //插入到f2链表中的f1链表的第一个pp结点
String str1="",str2="";int i;
//排序操作
while(true){
//得到链表f1的结点
Node p=new Node(f1p.num,f1p.name,f1p.score);
f2p=f2.head;i=1;  //设为链表f2的第i个结点
if(j==1){
str1=String.valueOf(p.num);
str2=String.valueOf(f2p.num);
}
if(j==2){
str1=String.valueOf(p.name);
str2=String.valueOf(f2p.name);
}
if(j==3){
str1=String.valueOf(p.score);
str2=String.valueOf(f2p.score);
}
//遍历链表f2,判断结点p插入到链表f2的位置
while(str1.compareTo(str2)>=0&&f2p.next!=null){
i++;f2p=f2p.next;
if(j==1) str2=String.valueOf(f2p.num);
if(j==2) str2=String.valueOf(f2p.name);
if(j==3) str2=String.valueOf(f2p.score);
}
if(str1.compareTo(str2)<=0){
if(f2.head.equals(f2p))
f2.appendToFront(p);
else f2.insert(p, i-1);
}
else f2.insert(p,i);
if(f1p.next==null) break;
f1p=f1p.next;
}
}
}
else
{
System.out.println("无第j个数据属性,不能排序");
}
return f2;
}
}

   //链表程序测试类
   


    public class Try {
public static void main(String args[]){
Integer n1=new Integer(1001), n2=new Integer(1008);
Integer n3=new Integer(1003), n4=new Integer(1002);
Integer n5=new Integer(1009), n6=new Integer(1005);

//创建浮点型对象
Double s1=new Double(89.0),s2=new Double(64.5),s3=new Double(90.0);
Double s4=new Double(79.0),s5=new Double(96.5),s6=new Double(80.0);
//创建结点对象
Node node1=new Node(n1,"Li1",s1),node2=new Node(n2,"Li2",s2);
Node node3=new Node(n1,"Li3",s1),node4=new Node(n2,"Li4",s2);
Node node5=new Node(n1,"Li5",s1),node6=new Node(n2,"Li6",s2);
//创建f1链表对象
List f1=new List("f1List");
//结点插入到f1链表头部
f1.appendToFront(node1);f1.appendToFront(node2);f1.appendToFront(node3);
//结点插入到f2链表尾部
List f2=new List("f2List");
f2.appendToFront(node4);f2.appendToFront(node5);f2.appendToFront(node6);

//打印f1链表中的所有结点
f1.visitAllNode(); System.out.println();
//打印f2链表中的所有结点
f2.visitAllNode(); System.out.println();

}

}

   下一篇是双链表队列的创建
  • 大小: 4 KB
  • 大小: 3.8 KB
  • 大小: 3.7 KB
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java api最新7.0

    JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java开发技术大全(500个源代码).

    HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java 中文入门学习手册合集[chm版]

    第一章 Java语言的产生及其特点 第二章 Java程序开发与运行环境 第三章 Java程序设计基础 第四章 Java应用程序的基本框架 第五章 Java的类 第六章 Java图形用户接口 第七章 多线程 第八章 Java的"异常" 第九...

Global site tag (gtag.js) - Google Analytics