手写集合框架LinkedList实现篇
Posted linjiab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写集合框架LinkedList实现篇相关的知识,希望对你有一定的参考价值。
《手写集合框架》LinkedList篇
嘿嘿嘿,拖延症犯了,这几天不怎么想写代码,所以趁没事干就写写了。进入正文
还是老套路嘻嘻嘻,因为我之前写了那个准备篇,对node已经描述的从差不多了,所以我就不过多描述了。 直接贴完代码强行解释一波
一、定义接口
public interface newList<T> { //定义泛型,因为Object可以存储任意类型,有时候我们需要
//用泛型 代替Object
public void add(Object object); //集合的添加方法
public void add(int index,Object object); //指定添加位置
public int size(); //获取集合的长度
public Object get(Integer i ); //获取下标的为i的元素
public void remove(Object o); //移除object对象
public void remove(int index); //移除size = index的元素
}
二、编写LinkedList类
1.定义属性
private newNode first = null ; //第一个节点
private newNode last = null ; //最后一个节点
private int size = 0; // 集合的长度
newNode还记得撒,我们上次定义了一个newNode类,整个链表的核心就是它,其他的内容就是方法也都是围绕它改改上下指向,来实现增删
2. add 添加方法
@Override
public void add(Object t) {
newNode newnode = new newNode(); //创建一个新的节点
if(first == null) { // 如果链表的第一个为空
newnode.Prev = null;
newnode.object = t; //第一个节点赋值
newnode.Next = null;
first = newnode ;
last = newnode; //最后一个节点就是当前新增进来的,下次添加一个节点时,prev就指向last
}else {
last.Next = newnode ; //我们要知道last是上一个节点
newnode.Prev = last ;
newnode.object = t ;
newnode.Next = null;
last = newnode ;
}
size ++; //长度增加
}
//节点遍历,拿到指定索引的元素
private newNode Node(int index) {
newNode temp = null;
if(first !=null) {
temp = first;
}
for (int i = 0; i < index; i++) {
temp = temp.Next;
}
//从第一个元素开始依次循环,直到拿到
return temp;
}
@Override
public void add(int index, Object object) {
if(index == size) { //添加到最后
newNode newnode = new newNode(); //新的元素
newnode.Prev = last;
newnode.object = object;
last.Next = newnode;
last = newnode;
}else { //插入到x的之前
newNode node = this.Node(index); //找到插入前的元素
newNode newnode = new newNode(); //
newNode prev = node.Prev;
newnode.Prev = node.Prev;
newnode.object = object;
newnode.Next = node;
if(node.Prev == null) { //如果上指向为空,则它就是第一个
first = newnode;
}else {
prev.Next = newnode;
node.Prev = newnode;
}
last.Next = newnode;
last = newnode;
}
size ++ ;
}
我只讲一下,为什么将新的元素赋给last,因为我们把last当做了最后一个操作的,到时候我们添加的时候如果添加到最后一个,这个last就是指向的依据。
3.remove() 方法
public void remove(int index) {
newNode newnode = Node(index);
deleteNode(newnode);
}
@Override
public void remove(Object object) {
if(object ==null) { //== null 也是可以存在链表的 所以我们不排除这种情况
for (newNode node = first; node != null; node = node.Next) {
if(node.object == null) {
this.deleteNode(node);
}
}
}else {
for (newNode node = first; node != null; node = node.Next) {
if(node.object.equals(object)) {
this.deleteNode(node);
}
}
}
}
//写一个公共的元素删除方法
public void deleteNode(newNode newnode) {
final Object object= newnode.object;
final newNode next = newnode.Next;
final newNode prev = newnode.Prev;
if(prev == null) { //如果当前节点的Prev为空 则代表它本身是第一个
first = next;
}else {
prev.Next = next;
newnode.Prev = null;
}
if(next == null) {//如果当前节点的Next为空 则代表它本身是最后一个
last = prev;
}else {
next.Prev = prev;
newnode.Next = null;
}
size -- ;
}
4.get 方法
@Override
public Object get(Integer i){
if(i<0 || i>size) { //不符合逻辑
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
return Node(i).object;
}
- WeChat: lljb1218
以上是关于手写集合框架LinkedList实现篇的主要内容,如果未能解决你的问题,请参考以下文章