[算法] 单链表插入排序(java)
2024-09-06 06:07:10
实现
- 首先保证插入前的链表是个完整的,最后一个节点要断开
- 然后在插入前链表中找到比待插入节点大的最小元素,插到前面即可
Link.java
class Link { private class Node {
int data;
Node next; public Node(int x) {
data = x;
}
public void addNode(Node newNode){
if(this.next == null){
this.next = newNode;
}else{
this.next.addNode(newNode);
}
}
} public Node root; public void add(int data){
Node newNode = new Node(data);
if(this.root==null){
this.root=newNode;
}else{
this.root.addNode(newNode);
}
} public void printLink(){
Node head = this.root;
while(head!=null) {
System.out.println(head.data);
head = head.next;
}
} public void insertionSortList() {
Node head = this.root;
if(head==null || head.next==null)
return;
Node dummy = new Node(-1);
dummy.next = head;
Node cur = head.next;
head.next = null;
while(cur != null) {
Node pre = dummy;
Node temp = cur.next; while (pre.next!=null && cur.data > pre.next.data){
pre = pre.next;
} cur.next = pre.next;
pre.next = cur;
cur = temp;
}
this.root=dummy.next;
return;
}
}
main.java
import java.lang.reflect.Array; public class Main { public static void main(String[] args) {
Link all = new Link(); int data[] = new int[]{5,4,3,2,1}; // for(int i = 0;i < data.length;i++){
// data[i] = i;
// } // data[0] = 0;
// int j = data.length-1;
// for(int i = 1;i < data.length;i++){
// data[i] = j;
// j--;
// } // int j = data.length;
// for(int i = 0;i < data.length;i++){
// data[i] = j;
// j--;
// } for(int i = 0;i < data.length;i++){
System.out.println(data[i]);
} for(int i = 0;i < data.length;i++){
all.add(data[i]);
} long startTime=System.currentTimeMillis();
all.insertionSortList();
long endTime=System.currentTimeMillis();
System.out.println(endTime-startTime); System.out.println("==================");
all.printLink(); }
}
数据结构分析
- 倒序链表:3->2->1
data | next | |||
R1 | R2 | |||
A | 3 | B | null | null |
B | 2 | C | A | A |
C | 1 | null | B | |
S | -1 | A | B | C |
- 顺序链表:1->2->3
data | next | |||
R1 | R2 | |||
A | 1 | B | B | B |
B | 2 | C | C | C |
C | 3 | null | null | null |
S | -1 | A | A | A |
- 乱序链表:3->2->4
data | next | |||
R1 | R2 | |||
A | 3 | B | null | C |
B | 2 | C | A | A |
C | 4 | null | null | |
S | -1 | A | B | B |
变量分析
- 共需定义5个变量:head、dummy、cur、pre、temp,可分为两类
- head、dummy、cur为初始变量,即为了操作链表初始创建的变量,head是链表头节点,dummy是哑节点,用于操作头节点,cur为当前节点,为头节点的下一个节点
- pre、temp为循环变量,是为了在循环中的操作创建,pre从哑节点开始,每次循环后移,比较每个元素和cur的大小,到cur的前一节点为止,temp是cur的下一个节点,用于在循环中将cur后移
最新文章
- WindowsForm公共控件--2016年12月5日
- JMeter学习-033-JMeter BeanShell 脚本应用实例之参数变量修改
- 在checkbox中使用.prop; angular中属性的值使用变量问题
- js实例:验证只能输入数字和一个小数点
- RSA 加解密转换
- 子类实例化和Super
- iOS 第一次安装应用,拒绝相机调用,页面卡死的解决方案
- Ubuntu 14.10 下安装Sublime Text 3,注册码,中文输入法
- Jquery的.post说解
- OpenStack Magnum 项目简单介绍
- linux查看服务器型号
- 再次记录老K站点的工作策略
- Object Detection &#183; RCNN论文解读
- RabbitMQ权限控制原理
- CF438E The Child and Binary Tree 生成函数、多项式开根
- Android 开发第一项目——计算器的开发记录
- 有什么学习MySQL的好教程吗?
- go标准库的学习-net/http
- 修復 “Failed to bring up eth0″ in Ubuntu virtualbox
- Linux下找不到动态链接库(转)
热门文章
- 为科学计算而生的Julia——基于Manjaro Linux的安装与入门
- 阿里云 RTC QoS 弱网对抗之变分辨率编码
- 第27 章 : Kubernetes 安全之访问控制
- C++并发与多线程学习笔记--线程之间调度
- [Fundamental of Power Electronics]-PART II-9. 控制器设计-9.4 稳定性
- 安卓安装kali linux之Termux
- gitee 学习笔记
- IDEA创建XML文件没有Spring Config选项
- JDBC_04_使用Properties集合保存JDBC所需配置信息
- 数据结构之队列(JavaScript描述)