MyLinkedList
/**
* 节点类
* @author JP
*
*/
class Node {
Object value;//节点元素值
Node pre;//上一个节点
Node next;//下一个节点 public Node(Object value) {
this.value = value;
}
} /**
* 链表类
* @author JP
*
*/
public class MyLinkedList {
Node cur;//目前指向的节点
Node head;//头结点
Node end;//尾节点
int size = 0; /**
* 实例化头节点和尾节点
*/
public MyLinkedList() { head = new Node("head");
end = new Node("end");
//设置头尾相连
head.next = end;
end.pre = head;
} /**
* 增加操作
* @param value
*/
public void add(Object value) {
//判断当前插入的元素是否是第一个元素
if (cur == null) {
cur = new Node(value);
head.next = cur;
cur.pre = head; } else {
Node node = new Node(value);
cur.next = node;
node.pre = cur;
cur = node;//将cur元素设置为当前插入的节点
}
cur.next = end;
end.pre = cur;
size++;
} /**
* 在指定位置插入元素,第一个元素的下标为0
* @param index
* @param value
* @throws Exception
*/
public void add(int index, Object value) throws Exception { //判断当前要插入的元素是否为链表的最后一个元素
if (index == size) {
this.add(value);
} else {
Node tmp = this.get(index);//当前index位置所对应的节点
Node node = new Node(value);//当前要插入的节点 tmp.pre.next = node;
node.pre = tmp.pre;
node.next = tmp;
tmp.pre = node;
}
size++;
} /**
* 删除指定位置的元素,第一个元素的下标为0
* @param index
* @throws Exception
*/
public void remove(int index) throws Exception { Node tmp = this.get(index);//当前index位置所对应的节点
tmp.pre.next = tmp.next;
tmp.next.pre = tmp.pre;
size--;
} /**
* 获取指定位置的节点元素
* @param index
* @return
* @throws Exception
*/
public Node get(int index) throws Exception {
if (index < 0 || index >= size) {
throw new Exception("数组下标越界!");
}
Node node = head.next;
for (int i = 1; i <= index; i++) { node = node.next;//迭代为下一个节点
}
return node;
} /**
* 将链表转化成数组
* @return
*/
public Object[] toArray() {
Object[] arr = new Object[size];
Node node = head.next;
for (int i = 0; i < arr.length; i++) { arr[i] = node.value;
node = node.next;//迭代为下一个节点
} return arr;
} public static void main(String[] args) throws Exception {
MyLinkedList list = new MyLinkedList();
list.add(1);
list.add(2); list.add(3);
list.add(4);
//list.remove(4);
//list.add(4,"a"); Object[] arr = list.toArray();
for (Object obj : arr) {
System.out.println(obj);
} }
}
MyLinkedList的更多相关文章
- 3.5 MyLinkedList 实现
3.5 MyLinkedList 类的实现 MyLinkedList 将用双链表实现,并且还需要保留该表两端的引用.这将需要三个类 MyLinkedList 类,包含到两端的链.表的大小以及一些方法. ...
- 深入理解java中的ArrayList和LinkedList
杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- 数据结构(Java描述)之线性表
基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...
- 自定义Java集合
一.泛型 1.在JDK1.4以前,所有的集合元素全都按照Object来存储,拿出来还要进行强制转型.由于这样的做法有太多的缺点,容易出现ClassCaseException,不安全,让人不省心,于是乎 ...
- Java Iterator, ListIterator 和 foreach语句使用
Java Iterator, ListIterator 和 foreach语句使用 foreach语句结构: for(part1:part2){part3}; part2 中是一个数组对象,或者是带 ...
- java基础语法要点<二>(基于1.8)
注解(元数据) 从jdk5 开始,java支持在源文件中嵌入补充信息,称为注释(annotation).注释不会改变程序的动作,也就不会改变程序的语义.但在开发和部署期间,各种工具可以使用这类信息.元 ...
- 约瑟夫环的java解决
总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...
- [AaronYang]C#人爱学不学[4]
本文章不适合入门,只适合有一定基础的人看.我更相信知识细节见高低,我是从4.0开始学的,终于有时间系统的学习C#5.0,是5.0中的知识,会特殊标记下.但写的内容也可能含有其他版本framework的 ...
随机推荐
- (I/O完成端口中的)995错误
在windows下,可能会出现995的错误,msdn对该错误的解释为: The I/O operation has been aborted because of either a thread ex ...
- ue4 碰撞检测测试
记录几条物理相关 测试条件,1使用setActorLocation移动,3使用控制器的移动 1 moveCube 2 targetCube 3 Character 两个Cube的碰撞事件 1和2的 ...
- Angular.js思维导图
AngularJS的四大特性的思维导图如下: 将AngularJS应用于工作:其思维导图如下: AngularJS服务思维导图:
- ES6入门教程---数值扩展和数组扩展
1.数值扩展 var num = 0b11; console.log(num);3 var num = 0o11;console.log(num);9 var num = 1.234; console ...
- GZS与小公园(DFS)
Description 某天GZS漫步在学校新建的小公园,他发现那里建成了一些水池和小河道.我们暂且把它们统一看成水池.假设公园旁有一张小公园的地图,上面仅标识了此处是否是水池,你能帮GZS计算出该地 ...
- Hive_Hive的数据模型_外部表
Hive的数据模型之外部表 外部表(External Table)- 指向已经在HDFS中存在的数据,可以创建Partition- 它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异. ...
- C#学习笔记:foreach原理
这篇随笔是对上一篇随笔C#关键字:yield的扩展. 关于foreach 首先,对于 foreach ,大家应该都非常熟悉,这里就简单的描述下. foreach 语句用于对实现 System.Col ...
- 笔试题五道spring
项目中如何体现Sping 中的切面编程,举例说明 面向切面编程:主要是横切 一个关注点,将一个关注点模块化成一个切面,在切面上声明一个通知(Advice)和切入点 (Pointcut) 通知:是指在切 ...
- MVC中验证码的简单使用
首先新建一个MVC项目 添加类:验证码帮助类(ValidateCodeHelper) using System; using System.Collections.Generic; using Sys ...
- 搭建本地SVN資料
基于網上眾多教程,搭建SVN成功:VisualSVN Server + TortoiseSVN Client. 過程比較簡單,就不重複書寫了. 部份參考資料,感謝作者: 什麽是SVN及如何應用 htt ...