[算法] 单链表插入排序(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> { // ...
随机推荐
- JS中dom操作的事件
Click--点击事件 优先级:dom.onclick 高于标签上的onClick属性 监听事件 --不会覆盖前面的事件效果 dom.addEventListener() 括号里面有三个参数 1 ...
- vue中的.sync修饰符用法
在项目中接触到父组件传值给子组件的时候,想在子组件改变父组件传的值.(比如用于弹窗关闭) 但是正常来说,vue2是不允许子组件直接改父组件传进去的值的. 所以我们需要在子组件内定义自定义事件,通知父组 ...
- 第3 章 : Kubernetes 核心概念
Kubernetes 核心概念 本文整理自 CNCF 和阿里巴巴联合举办的云原生技术公开课的课时 3:Kubernetes 核心概念.本次课程中,阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李 ...
- nsqlookupd:高性能消息中间件 NSQ 解析
摘要:本篇将会结合源码介绍 nsqlookupd 的实现细节. 本篇将会结合源码介绍 nsqlookupd 的实现细节.nsqlookupd 主要流程与nsqd 执行逻辑相似,区别在于具体运行的任务不 ...
- day-8 xctf-guess_num
xctf-guess_num 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&i ...
- 【运维】Shell -- 快速上手Shell脚本
1.Shell概述 shell脚本是利用shell的功能所写的一个[程序(program)].这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式.管道命令与数 ...
- .NET6 平台系列3 .NET CLR 详解
系列目录 [已更新最新开发文章,点击查看详细] CLR 简介 运行时(Runtime Environment,简称Runtime ),是指那些支持在特定的平台上,用于运行特定编程语言编写的软件 ...
- SpringAOP_设置注入实现
SpringAOP_设置注入实现 AOP_面向切面编程初步了解 让我们先想象一个场景,你正在编写一个项目,在开发过程中的多个模块都有某段重复的代码,于是你选择将其抽象成一个方法,然后在需要的地方调用这 ...
- 【JDK8】Java8 LocalDate操作时间和日期的API
时间项目中的涉及到的时间处理非常多,犹豫SimpleDateFormat的不安全性以及Calendar等类在计算时比较复杂, 往往我们都会使用工具类来封装较多的日期处理函数, 但是JDK8中新增了操作 ...
- AliCrackme_2题的分析
作者:Fly2015 AliCrackme_2.apk运行起来的注册界面,如图. 首先使用Android反编译利器Jeb对AliCrackme_2.apk的Java层代码进行分析. 很幸运,就找到了该 ...