[算法] 单链表插入排序(java)
实现
- 首先保证插入前的链表是个完整的,最后一个节点要断开
- 然后在插入前链表中找到比待插入节点大的最小元素,插到前面即可
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后移
[算法] 单链表插入排序(java)的更多相关文章
- 线性表概述及单链表的Java实现
一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- 单链表数据结构 - java简单实现
链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...
- javascript算法-单链表
链表相比数组更具灵活性和扩展性.主要有节点数据以及指向节点的指针所构成. 链表中节点的实现[元素和指针]: let Node = function( element ){ this.element = ...
- 排序算法之直接插入排序Java实现
排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序: ...
- 单链表之Java实现
初次接触java,用java也写了一个链表.代码如下: import java.io.*; class Node{ public int data; //数据域 public Node next; / ...
- 数据结构&算法-单链表
1.引言 工作一年了,感觉越来越懒散,把很多基础性的东西都慢慢遗忘了,最近想趁着还没忘完,回顾一下,整理了点笔记,分享一下. 如有错的地方,欢迎大家怒喷. 2.学习 我们就从最简单的链表开始吧. 链表 ...
- 单链表反转java代码
据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. public class Node { int index; Nod ...
- 使用java实现单链表----(java中的引用就是指针)
//一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...
随机推荐
- Logstash生产环境实践手册(含grok规则示例和ELKF应用场景)
ELKF应用场景: 1) datasource->logstash->elasticsearch->kibana 2) datasource->filebeat->log ...
- Kafka 常见问题汇总
Kafka 常见问题汇总 1. Kafka 如何做到高吞吐.低延迟的呢? 这里提下 Kafka 写数据的大致方式:先写操作系统的页缓存(Page Cache),然后由操作系统自行决定何时刷到磁盘. 因 ...
- C#修改AD账号及密码
在使用AD域环境搭建的账号系统修改密码的时候比较麻烦一般需要管理员在域环境去进行对用户的密码进行修改. 以下就是用来查询和修改AD域密码的方法. 1 /// <summary> 2 /// ...
- Lucas(卢卡斯)定理
Lucas(卢卡斯)定理 定义 若 \(p\) 为质数,且\(a\ge b\ge1\),则有: \[C_{a}^{b}\equiv C_{a/p}^{b/p}\cdot C_{a (mod\,p)}^ ...
- 大学四年,总结一套适合小白的Java自学路线和方法
前言篇 大家好,我是bigsai 好久不见,甚是想念,文章同时收录在回车课堂(文底阅读原文可达). 无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班.报班通常太费钱,时间又不 ...
- ECDSA密钥对生成以及在Token中的应用
1 概述 本文主要讲述了如何利用Openssl生成ECDSA密钥对,并利用Auth0库进行Token生成及验证的过程. 2 ECDSA 2.1 简介 ECC(Elliptic Curve Crypto ...
- 面试系列<3>——java并发
面试系列--java并发 一.使用线程 有三种使用线程的方法: 实现Runnable接口 实现Callable接口 继承Thread类 实现 Runnable 和 Callable 接口的类只能当做一 ...
- Salesforce学习之路(四)利用Jenkins和Git实现Salesforce的CI/CD功能
上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...
- 多图详解 TCP 连接管理,太全了!!!
TCP 是一种面向连接的单播协议,在 TCP 中,并不存在多播.广播的这种行为,因为 TCP 报文段中能明确发送方和接受方的 IP 地址. 在发送数据前,相互通信的双方(即发送方和接受方)需要建立一条 ...
- Day17_99_IO_FileReader文件字符输入流
FileReader文件字符输入流 * 继承结构 Java.lang.Object - java.io.Reader; 抽象类 java.io.InputStreamReader; <转换流: ...