数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)
创建结点类,链表类,测试类
import java.lang.Object;
//结点node=数据date+指针pointer
public class Node {
Object iprop;
public Object getIprop(int i){
switch(i){
case 1:iprop=num;break;
case 2:iprop=name;break;
case 3:iprop=score;break;
}
return iprop;
}
//数据data
Object num,name,score;
//指针pointer
Node next;
public Node(Object obj1,Object obj2,Object obj3){
num=obj1;
name=obj2;
score=obj3;
}
public Node(){ }
}
//链表List=头结点head+尾结点tail+链表名Lname
public class List { // 头结点head
Node head;
// 尾结点tail
Node tail;
// 链表名Lname
String Lname;
int length=0; // 初始化链表时,里面没有结点,为空链表
public List(String str) {
head = tail = null;
Lname = str;
} public List() {
head = tail = null;
Lname = "List";
} // 头插法
public List appendToFront(Node n) { if(this.head==null){
head=tail=n;
length++;
//n.next=null;
}else{ n.next=head;
head=n;
length++;
}
return this; } // 尾插法
public List appendToTail(Node n) {
//
if(head!=null){
tail.next=n;
tail=n;
}else{
head=tail=n;
//n.next=null;
}
return this; } // 插入结点到第i个结点之后
public void insert(Node n, int i) { } // 插入结点到第j个data为obj的结点之后
public void insert(Node n, Object obj, int i) { } // 遍历链表
public void visitAll() {
//创建pointer p
Node p=new Node();
//拿到头结点的引用
p=head;
//顺序拿到结点做展示
for(;p!=null;){
System.out.println("num:"+p.num+"name:"+p.name+"score:"+p.score);
p=p.next;
}
} // 拿到第i个结点
public Node getNode(int i) {
//定义浏览指针p
Node p=new Node(); //定义循环参数j
int j=1; //循环结点
p=this.head;
if(p!=null)
for(;j<i;j++){ p=p.next;
if(p==null){System.out.println("p==null遍历结束,无此结点");break;} }
return p;
} // 拿到第j个data为obj的结点
public Node getNode(Object obj, int j) {
//拿到头结点的引用
Node p=head;
//循环数据并比较data
for(;p!=null;){ for(int i=0;i<j;i++){
Object prop=p.getIprop(j);
if(prop!=null&&prop.equals(obj)) {return p;}
}
p=p.next;
}
return p;
} // 删除第i个结点
public void delete(int i) {
//找到i结点 } // 删除第j个data为obj的结点
public void delete(Object obj, int j) { } // 删除全部
public void deleteAll() { }
// 链表的排序:list中的node按第j个data的值进行排序
// >>直接插入法
public List listSort(int j){ //循环当前链表的结点对象,找到第j个data值
Node p=head;//想象head 下标为0,head.next依次类推
int[] datas=new int[this.length];
for(int i=0;p!=null;i++){
Object prop=p.getIprop(j);//
if(prop!=null){
System.out.println("循环到下标为"+i+"的结点");
datas[i]=Integer.parseInt(prop.toString()); }
p=p.next;
}
//冒泡排序
Node pre=null; for(int i=0;i<datas.length-1;i++){
pre=null;
p=head; for(int k=0;k<datas.length-i-1;k++){ if(datas[k]>datas[k+1]){ int temp=datas[k];
datas[k]=datas[k+1];
datas[k+1]=temp; Node tempNode=p.next.next; pre.next=p.next;
p.next.next=p;
p.next=tempNode; pre=pre.next; }else{
//拿到前驱结点
pre=p;
p=p.next;
}
}
} return this;
}
public static void main(String[] arg){
int[] datas={4,2,5,6,7,3,1,0,9,8};
//冒泡排序法
for(int i=0;i<datas.length-1;i++){
for(int j=0;j<datas.length-(i+1);j++){
if(datas[j]>datas[j+1]){
int temp=datas[j];
datas[j]=datas[j+1];
datas[j+1]=temp;
}
}
}
for(int i=0;i<datas.length;i++){
System.out.println(datas[i]);}
} }
public class TestList {
public static void main(String[] arg){
Node n0=new Node(125,"n0","91");
Node n1=new Node(123,"n1","98");
Node n2=new Node(121,"n2","99");
Node n3=new Node(125,"n3","96");
Node n4=new Node(125,"n4","95");
Node n5=new Node(125,"n5","97");
Node n6=new Node(125,"n6","93");
Node n7=new Node(125,"n7","94");
Node n8=new Node(125,"n8","92");
Node n9=new Node(125,"n9","90"); List f1=new List("f1List");
//头插法
f1.appendToFront(n0).appendToFront(n1).appendToFront(n2).appendToFront(n3)
.appendToFront(n4).appendToFront(n5).appendToFront(n6).appendToFront(n7)
.appendToFront(n8).appendToFront(n9); //拿到排好序的链表f2;
f1.listSort(3).visitAll(); } }
冒泡排序用处真大
心得:
>>对于指针(引用)的运用需要注意如下:
Node p=f1List.head;
p=p.next;//让指针直接指向(即直接p=)新引用对象(p.next),不会引起原被引用对象(head)的任何变化
Node p=f1List.head;
p.next=p;//调用原被引用对象的属性后,将会引起原被引用对象(head)的属性相应的变化
数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)的更多相关文章
- python中的数据结构-链表
一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...
- C语言:将字符串中的字符逆序输出,但不改变字符串中的内容。-在main函数中将多次调用fun函数,每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。
//将字符串中的字符逆序输出,但不改变字符串中的内容. #include <stdio.h> /************found************/ void fun (char ...
- C# 数据结构--单链表
什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...
- [C++] 数据结构应用——链表
C++ 数据结构应用--链表 代码已经封装成class啦,方便使用. 头文件:Linklist.h #include <iostream> /*********************** ...
- python算法与数据结构-单链表(38)
一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...
- 【PHP数据结构】链表的相关逻辑操作
链表的操作相对顺序表(数组)来说就复杂了许多.因为 PHP 确实已经为我们解决了很多数组操作上的问题,所以我们可以很方便的操作数组,也就不用为数组定义很多的逻辑操作.比如在 C 中,数组是有长度限制的 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- linux内核数据结构之链表
linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...
- 数据结构之链表-链表实现及常用操作(C++篇)
数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...
随机推荐
- java.lang.IllegalAccessError: tried to access method
java.lang.IllegalAccessException: access to method denied 06-23 16:12:39.128 1253-1253/com.hbjyjt.oa ...
- zabbix 利用python脚本实现短信告警
一.编写脚本 cd /usr/local/zabbix-4.0.3/share/zabbix/alertscripts vi zabbix_sms.py 内容如下: #!/usr/bin/python ...
- Bootstrap Tooltip
[Bootstrap Tooltip] 1.设置Tooltip: 1)data-toggle="tooltip" 2)data-placement="top", ...
- Debug模块
[Debug模块] 一个用于控制日志输出的模块. 参考: 1.http://www.jianshu.com/p/6b9833748f36 2.https://www.npmjs.com/package ...
- macaca自动化测试以及配置环境问题
macaca 测试和环境问题 标签(空格分隔): macaca自动化配置环境问题 macaca环境变量配置 基本环境需要准备的东西: JDK的安装及环境配置:(1.8) Node.js的安装及环境配置 ...
- H5前端框架推荐合集 (转)
Ionic ionic 吧开发流程都帮你做好了,已经不再是单纯的UI框架,而是开发框架了,非常适合快速开发.基于angular2,丰富的UI组件,大大改进的编程模型, Semantic UI 中文官网 ...
- sqlserver 当前时间减去30天
参考 https://zhidao.baidu.com/question/750666819064717772.html select dateadd(dd,-30,getdate()) from 表 ...
- 直接修改java的war包
会出现 jsp特征类型不对 descriptior UTF8 与ntfs 可以用jar命令来解决. 1.将war包移动到一个干净的路径下,使用jar xvf ROOT.war命令将war进行解压 ...
- dedecms(织梦系统)如何更新手机版首页模板文件
https://jingyan.baidu.com/article/ad310e80e4b1dd1849f49e8f.html
- 第十一章 串 (c3)KMP算法:理解next[]表