java对链表增删查改操作API

从c++方向搞点java副业。结果在静态链表这里绊了一跤。感谢巨人们的肩膀重见天日。

希望后来人少走些弯路。

废话少说,直接贴代码:

1.创建链表的节点类

public class Node {

private Node node;

private Object eleme;

public void setEleme(Object eleme) {

this.eleme = eleme;

}

public Node(){

this.eleme = null;node = null;

}

public Node(Object ele)

{

this.eleme = ele;node = null;

}

public Node(Object ele,Node nd)

{

this.eleme = ele;

this.node = nd;

}

public Object getEleme()

{

return this.eleme;

}

public Node getNextNode()

{

return this.node;

}

public void setNextNode(Node next)

{

this.node = next;

}

}

2.编写对外接口API

方便扩展用到泛型,实际调用的时候记得重写第三方类的equals(),toString()2个方法。

public class Link<E> {

private Node headNode;

private int nodeSize = 0;

private static String SPLITE_STRING = "-";

public Node getHeadNode() {

return headNode;

}

public int getSize()

{

return this.nodeSize;

}

/*

* 在末尾增加节点

*/

public void addNode(E ele) {

if(headNode !=null)

{

headNode = new Node(ele, headNode);

}else {

headNode = new Node(ele);

}

nodeSize++;

}

/*

* 在确定位置增加节点

*/

public void addNodeIndex(E ele,int index)

{

if(index==0){//如果从0位置插入,即从头部插入

addNode(ele);

}else {

if(index > nodeSize)

{

System.err.println("插入索引超过链表长度");

}else{

int count = 0;

for(Node nd = headNode;nd!=null;nd=nd.getNextNode()){

count++;

if(count == index)

{

Node nextNode =new Node(ele, nd.getNextNode());

nd.setNextNode(nextNode);

nodeSize++;

}

}

}

}

}

/*

* 删除确定位置index节点

*/

public void deleteNodeIndex(int index)

{

if(index >= nodeSize)

System.err.println("要删除的索引超过链表长度");

else{

if(index == 0)

{

headNode = headNode.getNextNode();

nodeSize--;

}else {

int count = 0;

Node nd = headNode;

while(++count < index){

nd = nd.getNextNode();

}

if(index == nodeSize - 1){

nd.setNextNode(null);

}else{

nd.setNextNode(nd.getNextNode().getNextNode());

}

}

}

}

/*

* 删除匹配元素的节点

* boolean toEnd:控制只删除第一匹配项还是全部匹配项

*/

public void deleteNodeEleme(E ele, boolean toEnd){

int count = 0;

for(Node ndNode = headNode;ndNode!=null;ndNode=ndNode.getNextNode(),count++){

if(ele.equals(ndNode.getEleme())){

deleteNodeIndex(count);

if(toEnd)continue;

else break;

}

}

}

/*

* 删除所有节点

*/

public void deleteAll()

{

headNode = null;

}

/*

* 查找指定index索引的节点

*/

public Node searchNodeIndex(int index){

if(index > nodeSize)

{

System.err.println("插入索引超过链表长度");

}else{

int count = 0;

Node nd = headNode;

while(++count < index){

nd = nd.getNextNode();

}

if(index == 0)return nd;

else return nd.getNextNode();

}

return null;

}

/*

* 查找相等元素的第一个节点

*/

public Node searchNodeEleme(E ele){

int count = 0;

for(Node ndNode = headNode;ndNode!=null;ndNode=ndNode.getNextNode(),count++){

if(ele.equals(ndNode.getEleme())){

return searchNodeIndex(count);

}

}

return null;

}

/*

* 得到包含该元素的节点集合

*/

@SuppressWarnings("finally")

public Node[] searchNodeEleme(E ele, Node[] node){

try{

int count = 0;int idex = 0;

for(Node ndNode = headNode;ndNode!=null;ndNode=ndNode.getNextNode(),count++){

if(ele.equals(ndNode.getEleme())){

node[idex++] = searchNodeIndex(count);

}

}

}catch(Exception ex)

{

node = null;

ex.printStackTrace();

}finally{

return node;

}

}

/*

* 改确定索引index的值为newEle

*/

public boolean modifyNodeIndex(int index,E newEle)

{

if(index > nodeSize)

{

System.err.println("修改索引超过链表长度");

}else{

int count = 0;

Node nd = headNode;

while(count++ < index){

nd = nd.getNextNode();

}

nd.setEleme(newEle);

}

return true;

}

/*

* 将匹配的旧元素oldEle改成新的newEle

* Boolean toEnd : 控制修改的范围是第一个匹配项还是全部匹配项

*/

public boolean modifyNodeEleme(E oldEle,E newEle,Boolean toEnd)

{

int count = 0;

for(Node ndNode = headNode;ndNode!=null;ndNode=ndNode.getNextNode(),count++){

if(oldEle.equals(ndNode.getEleme())){

modifyNodeIndex(count,newEle);

if(toEnd) continue;

else break;

}

}

return true;

}

/*

* 输出全部节点的元素

*/

public String printNode()

{

Node nextNode = headNode;

String dataString  = "";

while(nextNode!=null){

dataString +=nextNode.getEleme().toString();

dataString += SPLITE_STRING;

nextNode = nextNode.getNextNode();

}

return dataString;

}

}

3.编写测试用例

public class Main {

public static void main(String[] args)

{

@SuppressWarnings("rawtypes")

Link<String> link = new Link<String>();

String string = "";

link.addNode("A");

link.addNode("B");

link.addNode("A");

link.addNode("C");

link.addNodeIndex("KK", 2);

System.out.println( link.printNode());

System.out.println(link.getSize());

link.addNode("D");

link.addNodeIndex("GG", 0);

System.out.println( link.printNode());

link.addNode("A");

System.out.println(link.getSize());

link.addNode("E");

System.out.println( link.printNode());

/*查找测试

Node nnd = link.searchNodeIndex(0);

System.out.println(nnd.getEleme().toString());

Node nnd1 = link.searchNodeEleme("GG");

System.out.println(nnd1.getEleme().toString());

Node[] nodes = new Node[5];

nodes = link.searchNodeEleme("A", nodes);

for(int i = 0;nodes[i] != null;i++)

{

System.out.println(i + nodes[i].getEleme().toString());

}

*/

/*测试修改

link.modifyNodeIndex(0, "A");

Node nnd = link.searchNodeIndex(0);

System.out.println(nnd.getEleme().toString());

//link.modifyNodeEleme("A", "66666", true);

//System.out.println(link.printNode());

link.modifyNodeEleme("A", "66666", false);

System.out.println(link.printNode());

*/

/*测试删除

link.deleteNodeIndex(link.getSize() -1);

System.out.println(link.printNode());

link.deleteNodeEleme("E",true);

System.out.println(link.printNode());

link.deleteAll();

System.out.println(link.printNode());

*/

}

-----------------------------------------完--------------------------------------------

求大神点评,指正不足和错误,推荐一下java的进阶书籍,视频,网站,社区等。拜谢,跪谢。

时间: 2024-10-07 05:31:16

java对链表增删查改操作API的相关文章

YII数据库增删查改操作

初学YII, 整理了一些YII数据库的相关操作,  共同学习,共同进步. 一.查询数据集合 1 //1.该方法是根据一个条件查询一个集合 2 $admin=Admin::model()->findAll($condition,$params); 3 $admin=Admin::model()->findAll("username=:name",array(":name"=>$username)); 4 5 //2. findAllByPk(该方法是

Sqlite数据库增删查改操作

1.SqliteOpenHelper为数据库抽象类,需创建一个类继承他,其中有onCreate创建数据库的抽象方法和onUpgrade升级数据库方法(一般用不上). 1 //创建数据库的类 2 //SQLiteOpenHelper抽象类 onCreate和onUpgrade抽象方法 3 public class MySqliteHelper extends SQLiteOpenHelper { 4 5 //新建数据库以及表 6 private String SqlCpData="create t

少量代码带你熟悉MongoDB在Java下的增删查改

我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打开mongod.exe,程序运行期间要一直开着. 2.Java项目里面要导入mongo的jar包,mongo-版本号-jar. 以下为代码: public class MongoTest { public static void main(String args[]) throws UnknownH

myBatis 实现用户表增删查改操作&lt;方法1 没有使用接口的&gt;(最终版)

在UserMapper.xml中添加增删改查 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 如果我要调用mapper文件,就去拿到names

基础入门_Python-模块和包.深入SQLAlchemy之玩转各种增删查改操作?

增加数据: # 单行数据(from sqlalchemy import ...) conn = engine.connect() # 方式一: 调用表对象的insert ins = cookies.insert().values(     cookie_name='chocolate chip',     cookie_recipe_url='http://some.aweso.me/cookie/recipe.html',     cookie_sku='CC01',     quantity

myBatis 实现用户表增删查改操作&lt;方法2 加入接口&gt;(最终版)

这2种方法的区别:1.添加接口 2.运用接口来实现 其他的都一样 添加接口 //接口的名字和xml的名字一样,这样xml中的namespace就不用改 public interface UserMapper { //接口名的方法名一定要和xml中的id名一样 public int count(); public void add(User user); public void update(User user); public void delete(User user); public Lis

数据库的连接与简单的ATM增删查改操作

连接数据库有两种方式,直连和桥连,这里作者只讲一下普遍的直连,桥连读者想知道请自行百度 首先要有驱动软件,笔者的工具很旧 在你的java项目里面创建一个文件夹lib,将jar文件复制到里面,右键点击jar文件→Build Path→Configure Build Path→ 添加找到lib目录下的jar文件 确定 则会出现奶瓶,这样驱动就弄好的,下面开始连接 请注意里面所有的包都是java.sql下的 ,其中root是你的mysql账号,610321520是你的mysql的密码,3306是mys

python中关于list列表的增删查改操作

python中list的操#python创建列表的时候,会以堆栈的形式存放数据,从右向左往堆栈中存放数据 movies=["The holy Grail","The life of brain","The meaning of life"] movies=[] #len()表示长度print(len(movies))#python append在列表的末尾添加一个元素movies.append("Gillain")#pytho

Python学习笔记_05:使用Flask+MySQL实现用户登陆注册以及增删查改操作

前言:本文代码参考自两篇英文博客,具体来源点击文末代码链接中文档说明. 运行效果: 首页: 注册页面: 登陆界面: 管理员登陆后界面: 添加.删除.修改和查询员工所在部门信息界面(角色和员工界面类似): 源码链接及说明:https://coding.net/u/LiuZhen1995/p/MyDemo/git/tree/ten/ 附学习过程中参考资料: 1.config配置处理