Java单链表简单实现* @version 1.0
package com.list; /**
* 数据结构与算法Java表示
* @version 1.0
* @author 小明
*
*/
public class MyLinkedList {
private Node head;// 头结点
private int size;// 长度 public MyLinkedList() {
head = null;// 初始化头节点为空
size = 0;// 初始化长度为0
} // 重写toString方法
@Override
public String toString() {
String str = "";
Node temp = head;
for (; temp != null;) {
str += temp.getElement() + " ";
temp = temp.getNext();// 后移之末尾
}
str = "[ " + str + "]";
return str;
} /*
* add方法默认将结点加入到单链表的末尾
*/
public void add(Node node) {
if (head == null) {// 表明此时表为空,不存在头结点
head = node;// 创造头结点
size++;// 长度加一
} else {// 头结点存在
Node temp = head;// 将head赋值给临时变量
while (temp.getNext() != null) {
temp = temp.getNext();// 后移之末尾
}
temp.setNext(node);// 加入节点
size++;// 长度加一
}
} /*
* 插入函数
*/
public void add(int index, Node node) throws IndexException {
Node temp = head;// 将head赋值给临时变量
if (size == 0) {// 当表为空时调用add加入至表头
add(node);
return;
}
if (index <= 0 || index > size + 1) {// 索引位置不正确
throw new IndexException("索引位置不正确!");
} else {
if (index == 1) {// 插入位置为第一个是处理
node.setNext(head);// 将原来的头节点设置为插入节点的后继
head = node;// 头节点更改
size++;// 长度增加
} else {
if (index == size + 1) {// 此时默认插入表尾
add(node);
} else {// 插入既不是表头也不是表尾时
for (int i = 1; i < index - 1; i++) {
head = head.getNext();// 后移至插入位置前一位
}
node.setNext(temp.getNext());// 将temp的后继赋值给插入节点
temp.setNext(node);// 将temp的后继改为插入节点
size++;// 长度增加
}
}
} } /*
* 删除函数
*/
public void remove(int index) throws IndexException {
Node temp = head;// head赋值给temp
if (index <= 0 || index > size) {// 索引位置不正确
throw new IndexException("索引异常");
} else {// 索引正确
if (index == 1) {// 删除第一个元素
head = head.getNext();
size--;//长度减一
} else {
if (index == size) {// 索引正确删除最后一个元素
for (; temp.getNext().getNext() != null;) {// 移至倒数第二个元素
temp = temp.getNext();
}
temp.setNext(null);// 删除最后一个元素
size--;//长度减一
}else {//删除元素不在表头或表尾
for(int i=1;i<index-1;i++) {//后移至删除节点的前一个节点
temp=temp.getNext();
}
temp.setNext(temp.getNext().getNext());//删除
size--;//长度减一
}
}
}
} public static void main(String[] args) throws IndexException {
MyLinkedList list = new MyLinkedList();
list.add(1, new Node<>("asdas"));
list.add(1, new Node<>("202"));
list.add(new Node<>(85));
System.out.println(list);
list.remove(3);
System.out.println(list);
list.add(2,new Node<>(2154));
System.out.println(list);
}
} /*
* 结点
*/
class Node<T> {
private T element;// 值域
private Node next;// 指针域
// 节点初始化只可以设置值域 public Node(T element) {
this.element = element;
next = null;
} // 获取值域
public T getElement() {
return element;
} // 获取指针域
public Node getNext() {
return next;
} public void setNext(Node node) {
next = node;
}
} /*
* 索引异常类
*/
class IndexException extends Exception {
public IndexException() { } public IndexException(String s) {
super(s);
}
}
Java单链表简单实现* @version 1.0的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- java 单链表 练习
练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...
- Java运行 Unsupported major.minor version 51.0 错误
今天写了简单的Java程序,运行的时候不知道为啥出现这个问题 happy@happy-HP-Compaq-dx7518-MT:~/Study/CrazyJava$ java FieldTest Exc ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java单链表常用操作
总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
- JAVA单链表的实现-不带头结点但带有尾指针
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...
- JAVA单链表的实现-不带头结点且没有尾指针
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...
- java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
随机推荐
- Qt Widgets——抽象按钮及其继承类
QAbstractButton是有关“按钮”的基类 描述了一个按钮应该具有的组成.它的公有函数如下: QAbstractButton(QWidget * parent = ) ~QAbstractBu ...
- ubuntu启用root登陆
ubuntu系统不能够默认以root用户登陆系统如果你为了方便开发想每次登陆的时候以root用户登陆那么需要手动的做写更改打开终端 首先输入命令 sudo passwd root更新你的密码然后输入 ...
- bzoj4310
题解: 后缀数组求出本质不同的串 然后二分答案 贪心判断是否可行 代码: #include<bits/stdc++.h> ; using namespace std; typedef lo ...
- 【资料收集】OpenCV入门指南 系列文章
<OpenCV入门指南>系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764 目录: 第一篇 安装OpenCV ...
- List在遍历中删除t元素
法一:使用普通for循环遍历 注意: 1.从头开始循环,每次删除后 i 减一. 2.从尾开始循环. public class Main { public static voi ...
- Qt简单项目--加法计算器(详细代码注释)
Qt的简单案例--加法计算器(详细代码注释) 一.项目结构 二.项目代码 widget.h #ifndef WIDGET_H #define WIDGET_H //预编译指令, 为了避免头文件被重复包 ...
- Express工作原理和源码分析一:创建路由
Express是一基于Node的一个框架,用来快速创建Web服务的一个工具,为什么要使用Express呢,因为创建Web服务如果从Node开始有很多繁琐的工作要做,而Express为你解放了很多工作, ...
- Remove duplicates from array
//Given a sorted array, remove the duplicates in place such that each element appear only // once an ...
- Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制?
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- Array和ArrayList有什么区别?
Array和ArrayList的区别: 1.Array可以包含基本数据类型和对象类型,而ArrayList只能包含对象类型 2.Array有固定的大小,而ArrayList是动态变化的. 3.Arra ...