实现

  • 首先保证插入前的链表是个完整的,最后一个节点要断开
  • 然后在插入前链表中找到比待插入节点大的最小元素,插到前面即可

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 
 2   C 
 1  null   
 -1  A 
  • 顺序链表:1->2->3
  data  next   
     R1  R2
A  1  B  B  B
 2   C   C   C 
 3  null   null   null 
 -1  A   A   A 
  • 乱序链表:3->2->4
  data  next   
     R1  R2
A  3  B null   C
 2   C 
 4 null    null 
 -1  A    B  B

变量分析

  • 共需定义5个变量:head、dummy、cur、pre、temp,可分为两类
  • head、dummy、cur为初始变量,即为了操作链表初始创建的变量,head是链表头节点,dummy是哑节点,用于操作头节点,cur为当前节点,为头节点的下一个节点
  • pre、temp为循环变量,是为了在循环中的操作创建,pre从哑节点开始,每次循环后移,比较每个元素和cur的大小,到cur的前一节点为止,temp是cur的下一个节点,用于在循环中将cur后移

  

最新文章

  1. WindowsForm公共控件--2016年12月5日
  2. JMeter学习-033-JMeter BeanShell 脚本应用实例之参数变量修改
  3. 在checkbox中使用.prop; angular中属性的值使用变量问题
  4. js实例:验证只能输入数字和一个小数点
  5. RSA 加解密转换
  6. 子类实例化和Super
  7. iOS 第一次安装应用,拒绝相机调用,页面卡死的解决方案
  8. Ubuntu 14.10 下安装Sublime Text 3,注册码,中文输入法
  9. Jquery的.post说解
  10. OpenStack Magnum 项目简单介绍
  11. linux查看服务器型号
  12. 再次记录老K站点的工作策略
  13. Object Detection &#183; RCNN论文解读
  14. RabbitMQ权限控制原理
  15. CF438E The Child and Binary Tree 生成函数、多项式开根
  16. Android 开发第一项目——计算器的开发记录
  17. 有什么学习MySQL的好教程吗?
  18. go标准库的学习-net/http
  19. 修復 “Failed to bring up eth0″ in Ubuntu virtualbox
  20. Linux下找不到动态链接库(转)

热门文章

  1. 为科学计算而生的Julia——基于Manjaro Linux的安装与入门
  2. 阿里云 RTC QoS 弱网对抗之变分辨率编码
  3. 第27 章 : Kubernetes 安全之访问控制
  4. C++并发与多线程学习笔记--线程之间调度
  5. [Fundamental of Power Electronics]-PART II-9. 控制器设计-9.4 稳定性
  6. 安卓安装kali linux之Termux
  7. gitee 学习笔记
  8. IDEA创建XML文件没有Spring Config选项
  9. JDBC_04_使用Properties集合保存JDBC所需配置信息
  10. 数据结构之队列(JavaScript描述)