技术标签: 算法 java 算法总结 链表 递归算法 数据结构
什么是链表
链表注意的点
链表的头结点一般有两种定义形式,一种是直接以某个元素结点为头节点,如图:
public void putNode(int value) {
// 头节点为空校验
if (head == null) {
head = new Node(value);
} else {
Node temp = head;
while (temp.next != null) {
temp.next = temp;
}
temp.next = new Node(value);
}
}
第二种是以虚拟头节点头为头的节点,如图:
Node head = new Node(0); // 虚拟节点
public void putNode(int value) {
Node temp = head;
while (temp.next != null) {
temp.next = temp;
}
temp.next = new Node(value);
}
定义了虚拟节点之后,就不用每次插入元素都对头结点进行判空了。
代码简单实现一个链表的添加
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public class Solution {
ListNode head = new ListNode(0); // 虚拟节点
public static void main(String[] args) {
ListNode listNode = new ListNode();
// 方法一、以首节点为节点
for (int i = 0; i < 10; i++) {
ListNode node = new ListNode(i);
if (listNode.next == null){
node.next = listNode.next;
listNode.next = node;
}else {
node.next = listNode.next;
listNode.next = node;
}
}
// 方法二、以虚拟节点为节点
for (int i = 0; i < 10; i++) {
ListNode newNode = new ListNode(i);
// 2.新结点指向头结点之后的结点
newNode.next = head.next;
// 3.头结点指向新结点
head.next = newNode;
}
}
}
代码实现链表的增删改查
/**
* 创建节点类
*/
private class Node{
Integer value;
Node next;
public Node(Integer val,Node next){
this.value = val;
this.next = next;
}
public Node(Integer value){
this(value,null);
}
public Node(){
this(null,null);
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", next=" + next +
'}';
}
}
链表增删改查:
/**
* 链表
*/
public class Book008 {
// 虚拟头节点
Node dummyNode;
// 节点的个数
int size;
public Book008(){
this.dummyNode = new Node();
this.size = 0;
}
/**
* 添加节点
* @param index
* @param val
*/
public void addElement(int index, int val){
if (index < 0 || index > size){
throw new IllegalArgumentException("索引值不合法!");
}
Node temp = dummyNode;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
// 1、先让要添加的节点指向temp的下一个节点
Node newNode = new Node(val,temp.next);
// 2、再将temp的next指向node
temp.next = newNode;
size++;
}
/**
* 删除节点
* @param index
*/
public int delElement(int index){
if (index < 0 || index > size){
throw new IllegalArgumentException("索引值不合法!");
}
Node temp = dummyNode;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
Node nextNode = temp.next;
int result = nextNode.value;
temp.next = nextNode.next;
nextNode.next = null;
size --;
return result;
}
/**
* 修改元素
* @param index
* @param val
* @return
*/
public void updateElement(int index,int val){
// 校验省略
Node temp = dummyNode.next;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
temp.value = 12;
}
/**
* 获取元素
* @param index
* @return
*/
public int getElement(int index){
// 校验省略
Node node = dummyNode.next;
for(int i = 0 ; i < index ; i ++)
node = node.next;
return node.value;
}
/**
* 获取第一个元素
* @return
*/
public int getFirst(){
return getElement(0);
}
/**
* 获取最后一个元素
* @return
*/
public int getLast(){
return getElement(size - 1);
}
/**
* 是否包含
* @param val
* @return
*/
public boolean isContain(int val){
Node tempNode = dummyNode.next;
while (tempNode != null){
if (tempNode.value == val){
return true;
}
tempNode = tempNode.next;
}
return false;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("链表信息:");
Node temp = dummyNode.next;
while (temp != null){
builder.append(temp.value).append("-->");
temp = temp.next;
}
builder.append("NULL");
return builder.toString();
}
public static void main(String[] args) {
Book008 book008 = new Book008();
for (int i = 0; i < 5; i++) {
book008.addElement(i,i+1);
}
// 循环添加节点
System.out.println(book008);
// 添加节点
book008.addElement(2,10);
System.out.println(book008);
// 删除节点
int result = book008.delElement(2);
System.out.println("删除节点:"+result+" 之后: " + book008);
// 修改节点
book008.updateElement(3,12);
System.out.println("修改节点: " + book008);
// 判断节点是否存在
boolean contain = book008.isContain(2);
System.out.println("是否包含该元素:" + contain);
System.out.println("获取某一个元素:" + book008.getElement(2));
System.out.println("获取第一个元素:" + book008.getFirst());
System.out.println("获取最后一个元素:" + book008.getLast());
}
}
打印输出
2.隔离级别实现上一节介绍了ANSI定义的3种异象,及根据禁止异象的个数而定义的事务隔离级别。因为不存在严格、严谨的“官方”定义,各主流2.1 Lock-based 隔离级别实现在展示Lock-based隔离级别实现前,先介绍几个与锁相关的概念:Item Lock:对访问行加锁,可以防止dirty/fuzzy read。Predicate Lock(gap lock):对search的范围加锁,全..._jdbc默认事务隔离级别
title: 我要学好分布式-RMI通信框架date: 2018-07-26 19:28:30tags: [技术,我要学好分布式]分布式框架是最近几年的热门。可是要想理解分布式框架着实不易,为了努力跟上时代潮流,特此开了一个专题,起名“我要学好分布式”,通过博客来分享一下我的学习过程,加深我对分布式整体框架的理解。想要解锁更多新姿...
问题如图Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.我们在父类工程中如果引入数据库依赖,在子模块中一般会在配置文件中写明数据源的url等,但是在有些模块中不需要访问数据,这是启动这些子模块就会报上述错误解决方案在子模块启动类上面排除数据源自动配置类..._springboot 微服务起不来
DVWA (Dam Vulnerable Web Application) DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。本次我们测试使用的是Version 1.9 (Release date: 2015-09-19)。 今天我们首先完成的是low,也就是最简单的,其后我们会不断提高难度完成所有难度的挑战。在挑战的过程中我们会分析程序的源代码,了解漏洞产生的原理及简单的修复方案。 ..._dvwa1.9
一、首先要明白flush和commit区别: > flush: 写数据库,但不提交,也就是事务未结束 > commit: sqlalchemy会自动创建隐私的事务,先调用flush写数据库,然后提交,结束事务,并开始新的事务二、对db.session.flush进行探索(现有两张表,一主一外)class OrderInfo(db.Model)..._flask sqlalchemy 事务
1、定义一个类实现Runnable接口2、覆盖Runnable接口中的 run方法将线程要运行的代码放在run方法中3、同过Thread类建立线程对象4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。为什么要将Runnable接口的子类对象传递给Thread的构造函数。 因为,自定义的run方法所属的对象是Runnable 接口的子类对象。5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。 实现方式和继承的方式有什么区别?_runnable接口中的方法
转载:Oracle exp/imp备份(导出/导入备份) ORACLE 2008-12-19 11:28:13 阅读15 评论0 字号:大中小 ex...
【IT168技术】当前,Android手机应用的数量日益增多,其中很多应用已成为人们生活中不可缺少的助手。在众多的Android应用中,其中LBS(基于地理位置的的应用)深受人们的喜爱,主要原因是人们只需要使用手机,就能随时查看自己当前所在的位置,以及所处位置的相关其他信息,商家可以进入更深入的数据挖掘,如推销产品,基于LBS的交友聊天等等。 在本系列教程中,将指导开发者搭建一个简单的L
1.开发一个程序,用于记录车辆购置税。要求如下。>由控制台录入数据,提交后保存到MySQL数据库。>需要保存的信息:车主身份证号码(18位),车辆识别代码(17位),车辆排量,官方指导价,发票价格,缴纳车辆购置税金额。>目前车辆购置税征收办法如下。1.车辆购置税征收额根据计税价格计算,计税价格计算公式如下。 计税价格=购车发票价格 /...
在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入才,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.他们的区别:stdin等是FILE *类型,属于标准I/O,在。STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有b...
文章目录一、Spring是什么二、源码分析自研Spring框架Xml解析Bean单例注册BeanFactory一、Spring是什么spring其实是一个容器框架,可以用来配置各种bean(配置文件xml),并且可以维护bean与bean的关系,当我们需要某个bean的时候,只需要getBean(id) 就可以了。这里getBean是以反射为基础的,因为一开始并不知道我要初始化的类对象是什么,只能通过xml文件解析出类的路径,所以不能用new来创建对象。没有spring之前,我们都是通过代码来维_spring项目总结
#!/bin/bash#--------------------------------------------------------# Function: Install php7 for Centos# Date: 2017-10-03# Author: Jason Wang#----------------------------------------------------..._shell编译安装php环境