Java实现单链表的增删查改及逆置打印
//所提供的接口
LinkList.java
package Struct;
public interface LinkList {
//判断链表为空
public boolean linkListIsEmpty();
//尾插
public void linkListPushBack(Object obj);
//尾删
public void linkListPopBack();
//头插
public void linkListPushFront(Object obj);
//头删
public void linkListPopFront();
//打印链表
public void disPlayList(LNode node);
//查找元素在链表中的位置
public int linkListFindByEle(LNode node,Object to_find);
//指定位置查找
public Object linkListFindByIndex(int index);
//在pos之后插入元素
public void linkListInsertAfter(LNode node,int pos,Object obj);
//删除指定值的元素
public void linkListRemove(LNode node,Object to_delete);
//删除指定位置的元素
public void linkListErase(int pos);
//求链表长度
public int linkListSize();
//链表的逆置
public LinkList2 reverseList(LinkList2 linkList2);
}
//接口的实现
LinkList2.java
package Struct;
class LNode{
LNode nextNode;//下一个节点的引用
Object obj;//节点的元素
public int length;
//构造函数
public LNode(Object obj){
this.obj = obj;
}
}
public class LinkList2 implements LinkList {
LNode head = null;//创建一个空链表
LNode tail = head;//尾节点,并记录当前节点的位置
int count = 0;//统计节点的个数
//判断链表是否为空
public boolean linkListIsEmpty() {
return(count==0);
}
//尾插
public void linkListPushBack(Object obj){
LNode node = new LNode(obj);
if(head == null){
head = node;//链表为空直接插入
}else{
tail.nextNode = node;//链表非空直接在tail当前节点的位置进行尾插
}
count++;
tail = node;//置node为前节点
}
//尾删
public void linkListPopBack() {
if(head == null){
return;//空链表不可进行尾删操作
}else{
while(head.nextNode == tail){
head = head.nextNode;
}
head.nextNode.nextNode = null;
}
count--;
}
//头插
public void linkListPushFront(Object obj) {
LNode node = new LNode(obj);
if(head == null){
head = node;
}else{
node.nextNode = head;
head = node;//改变头结点的位置
}
count++;
}
//头删
public void linkListPopFront(){
if(head == null){
return;//空链表无可删除元素
}else{
head = head.nextNode;
}
count--;
}
//打印链表(node表示从哪个节点开始打印)
public void disPlayList(LNode node) {
if(node != null){
System.out.print(node.obj);
System.out.print(" ");
node = node.nextNode;
disPlayList(node);//递归调用打印函数
}
System.out.println();
}
//查找元素在链表中的位置
public int linkListFindByEle(LNode node,Object to_find) {
if(head == null){
return -1;//表示空链表,未找到
}else{
int index = 0;
for(;node.obj!=to_find;){
node = node.nextNode;
index++;
}
return index;
}
}
//查找指定位置的元素
public Object linkListFindByIndex(int index){
LNode node = head;
if(index >= count){
System.out.println("indexOutOfBoundsException!");
return -1;//查找位置超过链表长度
}
for(int i = 0;i < index;i++){
node = node.nextNode;
}
return node.obj;
}
//在指定位置后插入元素
public void linkListInsertAfter(LNode node,int pos,Object obj){
LNode node1 = new LNode(obj);
if(head == null){
head = node;//空链表直接插入,即pos无效
}else{
for(int index = 0;index!=pos;index++){
node = node.nextNode;
}
LNode node2 = node.nextNode;
node.nextNode = node1;
node1.nextNode = node2;
}
count++;
}
//删除指定值的元素
public void linkListRemove(LNode node,Object to_delete) {
if(head == null){
return;//空链表无可删除元素
}else{
for(;node.nextNode.obj != to_delete;){
node = node.nextNode;
}
node.nextNode = node.nextNode.nextNode;
}
count--;
}
//删除指定位置的元素
public void linkListErase(int pos){
if(pos >= count){
//要查找的下标超过链表长度
System.out.println("indexOutOfBoundsException!");
return;
}
LNode node = head;
//要删除节点为第一个节点
if(pos == 0){
head = head.nextNode;
count--;
return;
}
//要删除节点为尾节点
if(pos == count-1){
//需要找到最后一个节点大的前一个节点
int temp = 0;
if(node != null && temp < pos-1){
//要删除节点的前一个节点
node = node.nextNode;
temp++;
}
count--;
return;
}
//要删除节点为中间节点
int temp1 = 0;
if(node != null && temp1 < pos-1){
node = node.nextNode;
temp1++;
}
node.nextNode = node.nextNode.nextNode;
count--;
}
//求链表长度
public int linkListSize() {
return count;
}
//链表的逆置
public LinkList2 reverseList(LinkList2 linkList){
LinkList2 reverseLinkList = new LinkList2();
for(int i = count - 1;i >= 0;i--){
reverseLinkList.linkListPushBack(linkList.linkListFindByIndex(i));
}
return reverseLinkList;
}
}
//测试代码
package Struct;
/**
* @作者:dyy
* @公司:陕西科技大学
* @修改日期:
* @邮箱:1101632375@qq.com
* @描述:
*/
public class TestLinkList2 {
public static void main(String[] args) {
LinkList2 link = new LinkList2();
System.out.println(link.linkListIsEmpty());
System.out.println("尾插四个元素");
link.linkListPushBack(1);
link.linkListPushBack(2);
link.linkListPushBack(3);
link.linkListPushBack(4);
link.disPlayList(link.head);
System.out.println("查找指定元素所在下标");
System.out.println(link.linkListFindByEle(link.head, 1));
System.out.println("查找指定下标的元素");
System.out.println(link.linkListFindByIndex(3));
link.linkListPopBack();
link.linkListPopBack();
System.out.println("尾删两个元素:");
link.disPlayList(link.head);
System.out.println("头插两个元素:");
link.linkListPushFront("lemon");
link.linkListPushFront("demon");
link.disPlayList(link.head);
System.out.println("指定位置后插入");
link.linkListInsertAfter(link.head, 2, 5);
link.disPlayList(link.head);
System.out.println("链表长度:");
System.out.println(link.linkListSize());
System.out.println("删除指定值的元素");
link.linkListRemove(link.head,"lemon");
link.disPlayList(link.head);
System.out.println("头删两个元素:");
link.linkListPopFront();
link.linkListPopFront();
link.disPlayList(link.head);
System.out.println("链表长度:");
System.out.println(link.linkListSize());
System.out.println("最终链表为:");
link.linkListPushFront("哈哈");
link.linkListPushFront(57);
link.linkListInsertAfter(link.head, 2, 2);
link.disPlayList(link.head);
System.out.println("链表长度:");
System.out.println(link.linkListSize());
System.out.println("删除指定位置的元素:");
link.linkListErase(4);
link.linkListErase(1);
link.disPlayList(link.head);
System.out.println("删除后链表长度:");
System.out.println(link.linkListSize());
System.out.println("逆置后的链表");
link = link.reverseList(link);
link.disPlayList(link.head);
}
}
运行结果:
Java实现单链表的增删查改及逆置打印的更多相关文章
- java实现单链表的增删功能
JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...
- java实现单链表增删改查
package 数据结构算法.链表; /* *定义节点 * 链表由节点构成 */ public class Node<E> { private E e; //数据data private ...
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
- c++链表-双向链表+增删查改
基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...
- java 利用注解实现BaseDao 增删查改
第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...
- HDFS Java Client对hdfs文件增删查改
step1:增加依赖 pom.xml ... <!-- https://mvnrepository.com/artifact/org.apache.hadoop ...
- java中CRUD(增删查改)底层代码的实现
java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...
- java实现简单的数据库的增删查改,并布局交互界面
一.系统简介 1.1.简介 本系统提供了学生信息管理中常见的基本功能,主要包括管理员.管理员的主要功能有对学生信息进行增加.删除.修改.查找等操作,对信息进行管理,对信息进行修改.查找等操作 ...
- MongoDB在Java下的增删查改
我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打 ...
随机推荐
- Python里字符串Format时的一个易错“点”
这是一篇很小的笔记,原因是我做学习通的时候见到了这个题: 当时看了一会儿发现没有符合自己想法的答案,然后就脑袋一热选了C,结果当然是错了... 看了一眼这个format的字符串对象,发现有个 {:7. ...
- Jenkins+SVN+Maven+testNG管理项目
1.登录访问:http://localhost:8080/jenkins 2.系统管理 => 全局工具配置 => ADD JDK AND Add Maven 3.安装SVN插件:系统管 ...
- mapper接口绑定异常
前言 由于MP的代码生成器把mapper接口绑定的写sql语句xml文件创建在java目录下,而Maven加载机制只会将.java文件编译成.class文件,所以在target目录下找不到写xml文件 ...
- vue配置请求拦截器和响应拦截器
首先确保我们已经设置的store.js进行值的存取,这时候我们需要配置请求和响应的拦截器设置 main.js import Vue from 'vue' import App from './App' ...
- SqlServer修改某个字段的默认值时的操作步骤
sqlserver有时候需要修改一个字段的默认值,却发现修改(update)不了,也删除(delete)不了,排查发现,需要先删除原有的默认值约束,才行:步骤如下1.2.3.若原来这个字段就没有默认值 ...
- java注解@Transactional事务类内调用不生效问题及解决办法
@Transactional 内部调用例子 在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理,这会造成自调用问题.若同一类中的其他没有@T ...
- Python知识整理(一)
一.Python交互模式(终端上进行) python # 进入到Python交互模式,提示符是 >>> exit() # 退出Python交互模式 python xxx.py # 执 ...
- OAuth 2.0 扩展协议之 PKCE
前言 阅读本文前需要了解 OAuth 2.0 授权协议的相关内容, 可以参考我的上一篇文章 OAuth 2.0 的探险之旅. PKCE 全称是 Proof Key for Code Exchange, ...
- [loj2469]最小方差生成树
2018年论文题 约定:令点集$V=[1,n]$.边集$E=[1,m]$,记$m$条边依次为$e_{i}=(x_{i},y_{i},c_{i})$(其中$1\le i\le m$),将其按照$c_{i ...
- [atARC094D]Worst Case
首先,容易证明满足条件的$ip_{i}$必然是一个前缀 将其看成一张二分图,$i$向满足$ip_{i}<xy$的$p_{i}$连边,即找到一个前缀满足其有完美匹配 二分枚举前缀长度$k$,根据h ...