当前位置: 首页 > news >正文

数据结构:链表 链表按结点中第j个数据属性排序(冒泡排序法)

创建结点类,链表类,测试类
 1 import java.lang.Object;
 2 //结点node=数据date+指针pointer
 3 public class Node {
 4     Object iprop;
 5     public Object getIprop(int i){
 6     switch(i){
 7     case 1:iprop=num;break;
 8     case 2:iprop=name;break;
 9     case 3:iprop=score;break;
10     }
11     return iprop;
12     }
13    //数据data
14     Object num,name,score;
15     //指针pointer
16     Node next;
17     public Node(Object obj1,Object obj2,Object obj3){
18         num=obj1;
19         name=obj2;
20         score=obj3;
21     }
22     public Node(){
23     
24     }
25 }
View Code
  1 //链表List=头结点head+尾结点tail+链表名Lname
  2 public class List {
  3 
  4     // 头结点head
  5     Node head;
  6     // 尾结点tail
  7     Node tail;
  8     // 链表名Lname
  9     String Lname;
 10     int length=0;
 11 
 12     // 初始化链表时,里面没有结点,为空链表
 13     public List(String str) {
 14         head = tail = null;
 15         Lname = str;
 16     }
 17 
 18     public List() {
 19         head = tail = null;
 20         Lname = "List";
 21     }
 22 
 23     // 头插法
 24     public List appendToFront(Node n) {
 25         
 26         if(this.head==null){
 27            head=tail=n;
 28            length++;
 29            //n.next=null;
 30         }else{
 31             
 32             n.next=head;
 33             head=n;
 34             length++;
 35         }
 36         return this;
 37 
 38     }
 39 
 40     // 尾插法
 41     public List appendToTail(Node n) {
 42         //
 43         if(head!=null){
 44            tail.next=n;
 45            tail=n;
 46         }else{
 47             head=tail=n;
 48             //n.next=null;
 49         }
 50         return this;
 51 
 52     }
 53 
 54     // 插入结点到第i个结点之后
 55     public void insert(Node n, int i) {
 56 
 57     }
 58 
 59     // 插入结点到第j个data为obj的结点之后
 60     public void insert(Node n, Object obj, int i) {
 61 
 62     }
 63 
 64     // 遍历链表
 65     public void visitAll() {
 66        //创建pointer p
 67        Node p=new Node();
 68        //拿到头结点的引用
 69        p=head;
 70        //顺序拿到结点做展示
 71        for(;p!=null;){
 72            System.out.println("num:"+p.num+"name:"+p.name+"score:"+p.score);
 73            p=p.next;
 74        }
 75     }
 76 
 77     // 拿到第i个结点
 78     public Node getNode(int i) {
 79         //定义浏览指针p
 80         Node p=new Node();
 81         
 82         //定义循环参数j
 83         int j=1;
 84         
 85         //循环结点
 86         p=this.head;
 87         if(p!=null)
 88         for(;j<i;j++){
 89             
 90             p=p.next;
 91             if(p==null){System.out.println("p==null遍历结束,无此结点");break;}
 92             
 93         }
 94         return p;
 95     }
 96 
 97     // 拿到第j个data为obj的结点
 98     public Node getNode(Object obj, int j) {
 99         //拿到头结点的引用
100         Node p=head;
101         //循环数据并比较data
102             for(;p!=null;){
103                 
104                 for(int i=0;i<j;i++){
105                 Object prop=p.getIprop(j);    
106                 if(prop!=null&&prop.equals(obj)) {return p;}
107                 }
108                 p=p.next;
109             }
110         return p;
111     }
112 
113     // 删除第i个结点
114     public void delete(int i) {
115         //找到i结点
116 
117     }
118 
119     // 删除第j个data为obj的结点
120     public void delete(Object obj, int j) {
121 
122     }
123 
124     // 删除全部
125     public void deleteAll() {
126 
127     }
128     // 链表的排序:list中的node按第j个data的值进行排序
129     // >>直接插入法
130     public List listSort(int j){
131         
132         //循环当前链表的结点对象,找到第j个data值
133         Node p=head;//想象head 下标为0,head.next依次类推
134         int[] datas=new int[this.length];
135         for(int i=0;p!=null;i++){
136             Object prop=p.getIprop(j);//
137             if(prop!=null){
138                 System.out.println("循环到下标为"+i+"的结点");
139                 datas[i]=Integer.parseInt(prop.toString());
140                 
141             }
142             p=p.next;
143         }
144         //冒泡排序
145         Node pre=null;
146         
147         for(int i=0;i<datas.length-1;i++){
148             pre=null;
149             p=head;
150             
151             for(int k=0;k<datas.length-i-1;k++){
152                 
153                 
154                 if(datas[k]>datas[k+1]){
155                     
156                     int temp=datas[k];
157                     datas[k]=datas[k+1];
158                     datas[k+1]=temp;
159                     
160                     
161                     Node tempNode=p.next.next;
162                     
163                     pre.next=p.next;
164                     p.next.next=p;
165                     p.next=tempNode;
166                     
167                     pre=pre.next;
168                     
169                 }else{
170                 //拿到前驱结点
171                 pre=p;
172                 p=p.next;
173                 }
174             }
175         }
176         
177         return this;
178     }
179     public static void main(String[] arg){
180         int[] datas={4,2,5,6,7,3,1,0,9,8};
181         //冒泡排序法
182         for(int i=0;i<datas.length-1;i++){
183             for(int j=0;j<datas.length-(i+1);j++){
184                 if(datas[j]>datas[j+1]){
185                     int temp=datas[j];
186                     datas[j]=datas[j+1];
187                     datas[j+1]=temp;
188                 }
189             }
190         }
191         for(int i=0;i<datas.length;i++){
192         System.out.println(datas[i]);}
193     }
194 
195     
196 }
View Code
 1 public class TestList {
 2     public static void main(String[] arg){
 3         Node n0=new Node(125,"n0","91");
 4         Node n1=new Node(123,"n1","98");
 5         Node n2=new Node(121,"n2","99");
 6         Node n3=new Node(125,"n3","96");
 7         Node n4=new Node(125,"n4","95");
 8         Node n5=new Node(125,"n5","97");
 9         Node n6=new Node(125,"n6","93");
10         Node n7=new Node(125,"n7","94");
11         Node n8=new Node(125,"n8","92");
12         Node n9=new Node(125,"n9","90");
13         
14         
15         List f1=new List("f1List");
16         //头插法
17         f1.appendToFront(n0).appendToFront(n1).appendToFront(n2).appendToFront(n3)
18         .appendToFront(n4).appendToFront(n5).appendToFront(n6).appendToFront(n7)
19         .appendToFront(n8).appendToFront(n9);
20         
21         
22         //拿到排好序的链表f2;
23         f1.listSort(3).visitAll();
24         
25         
26         
27         
28     }
29 
30 }
View Code

冒泡排序用处真大

心得:

>>对于指针(引用)的运用需要注意如下:

        Node p=f1List.head;

        p=p.next;//让指针直接指向(即直接p=)新引用对象(p.next),不会引起原被引用对象(head)的任何变化

        Node p=f1List.head;
        p.next=p;//调用原被引用对象的属性后,将会引起原被引用对象(head)的属性相应的变化

转载于:https://www.cnblogs.com/kuiyeit/p/4692864.html

相关文章:

  • 批处理命令调用WINRAR对文件进行压缩
  • 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
  • 批处理命令拷贝文件
  • 我4年前写的第一个ruby程序
  • c# 调用c DLL 所传参数不正确
  • 离职那天我们复员——Leo网上答疑53
  • Spark工作机制-调度与任务分配
  • DT大数据梦工厂 第74讲
  • TCP SYN-Cookie背后的人和事
  • Unity3D NGUI 点击穿透问题的解决方案
  • C++ VS C#(4):枚举,结构体
  • 字节对齐问题 --- 莫名其妙的crash
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • 物联网系统设计初稿
  • Python xlsx 读取
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android Volley源码解析
  • Angular6错误 Service: No provider for Renderer2
  • AngularJS指令开发(1)——参数详解
  • go语言学习初探(一)
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java第三方包学习之lombok
  • Laravel 菜鸟晋级之路
  • PhantomJS 安装
  • Python进阶细节
  • webpack入门学习手记(二)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 深度学习在携程攻略社区的应用
  • 世界上最简单的无等待算法(getAndIncrement)
  • 移动端 h5开发相关内容总结(三)
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​VRRP 虚拟路由冗余协议(华为)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (强烈推荐)移动端音视频从零到上手(下)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET多线程执行函数
  • .Net环境下的缓存技术介绍
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET性能优化(文摘)
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Resource和@Autowired的区别
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [AIGC] Spring Interceptor 拦截器详解
  • [android] 手机卫士黑名单功能(ListView优化)
  • [BSGS算法]纯水斐波那契数列
  • [bzoj2957]楼房重建
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [GN] 设计模式——面向对象设计原则概述
  • [HDU] 1054 Strategic Game 入门树形DP
  • [HTTP]HTTP协议的状态码