手写基本容器——LinkedList
底层实现
1、LinkedList的底层实现是通过定义像链表一样的结构
2、每个表的开始都是有一个first和last来记录我们的第一个和最后一个的value值的地址就可以,然后中间的部分我们可以使用“前一个”和“下一个”来遍历整个数组
3、我们可以将这个结构定义为一个Node,每次new一次都会产生这个节点,前后自动的连接,这样的化就会自动的形成一个链子的结构
4、我们将处理函数放在一个地方,在将Node放在另外的一个地方,代码变得简单
1、建立一个Node节点
public class Node {
private Node Pr;
private Node Ne;
Object element;
public Node(Node pr, Node ne, Object element) {
super();
Pr = pr;
Ne = ne;
this.element = element;
}
public Node getPr() {
return Pr;
}
public void setPr(Node pr) {
Pr = pr;
}
public Node getNe() {
return Ne;
}
public void setNe(Node ne) {
Ne = ne;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
public Node(Object element) {
super();
this.element = element;
}
}
2、添加add和toString的方法
import myConlection.Node;
/***
* 创建一个一个链表
* 添加一些基本的方法
* @author starwang
*
*/
public class myLinkList1 {
private Node first;
private Node last;
public void add(Object obj) {
Node node = new Node(obj);
if(first==null) {
node.setNe(null);
node.setPr(null);
first = node;
last = node;
}else {
//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
node.setPr(last);
node.setNe(null);
//设置上一个跳转的下一额对象为本对象
last.setNe(node);
last = node;
}
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
Node tmpe = first;
while(tmpe!=null) {
sb.append(tmpe.getElement()+",");
tmpe =tmpe.getNe();
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args) {
myLinkList1 li = new myLinkList1();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
System.out.println(li);
}
}
3、添加remove的功能
删除的时候只需要修改对应的连接就行
import myConlection.Node;
/***
* 添加remove的功能
* @author starwang
*
*/
public class myLinkList2 {
private Node first;
private Node last;
private int size;
public void add(Object obj) {
Node node = new Node(obj);
if(first==null) {
node.setNe(null);
node.setPr(null);
first = node;
last = node;
}else {
//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
node.setPr(last);
node.setNe(null);
//设置上一个跳转的下一额对象为本对象
last.setNe(node);
last = node;
}
size++;
}
/***
* 获取这个元素
* @param index
* @return
*/
public Object getElement(int index) {
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
/**
*未优化的代码
*/
// Node tmpe = first;
// for (int i = 0; i < index; i++) {
// tmpe = tmpe.getNe();
// }
/**
* 优化的代码,选着在哪里进行开始查询
*/
Node tmpe;
int b = (size>>1);
if(index<=b) {
tmpe = first;
for(int i=0;i<index;i++) {
tmpe = tmpe.getNe();
}
}else {
tmpe = last;
for(int i=(size-1);i>index;i--) {
tmpe = tmpe.getPr();
}
}
return tmpe.getElement();
}
/***
* 获取指定位置的node
* @param index
* @return
*/
public Node getNode(int index ) {
Node temp ;
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
int b = (size>>1);
if(index<=b) {
temp = first;
for(int i=0;i<index;i++) {
temp = temp.getNe();
}
}else {
temp = last;
for(int i=(size-1);i>index;i--) {
temp = temp.getPr();
}
}
return temp;
}
/***
* 直接删除指定位置的索引
* @param index
*/
public void remove(int index) {
Node temp;
Node Up;
Node down;
temp = getNode(index);
if(index==0) {
if(size==1) {
first=null;
last=null;
size--;
}else {
first = temp.getNe();
first.setPr(null);
size--;
}
}else if(index==(size-1)){
last = temp.getPr();
last.setNe(null);
size--;
}else {
Up = temp.getPr();
down = temp.getNe();
Up.setNe(temp.getPr());
down.setPr(down.getPr());
size--;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
// sb.append();
Node tmpe = first;
while(tmpe!=null) {
sb.append(tmpe.getElement()+",");
tmpe =tmpe.getNe();
}
if(size==0) {
sb.append(']');
}
else {
sb.setCharAt(sb.length()-1, ']');
}
return sb.toString();
}
}
4、添加泛型
import myConlection.Node;
/***
* 添加remove的功能
* @author starwang
*
*/
public class myLinkList3 <E>{
private Node first;
private Node last;
private int size;
public void add(E obj) {
Node node = new Node(obj);
if(first==null) {
node.setNe(null);
node.setPr(null);
first = node;
last = node;
}else {
//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
node.setPr(last);
node.setNe(null);
//设置上一个跳转的下一额对象为本对象
last.setNe(node);
last = node;
}
size++;
}
public void add(int index,E obj) {
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
if(index==0) {
Node node = new Node(obj);
if(size==0) {
node.setNe(null);
node.setPr(null);
first = node;
last = node;
size++;
}else{
first.setPr(node);
node.setNe(first);
first = node;
size++;
}
}else if(index ==(size-1)) {
add(obj);
}else {
Node node = new Node(obj);
Node temp = getNode(index);
Node temp1 = temp.getPr();
temp.setPr(node);
temp1.setNe(node);
node.setPr(temp1.getNe());
node.setNe(temp.getPr());
size++;
}
}
/***
* 获取这个元素
* @param index
* @return
*/
public E getElement(int index) {
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
/**
*未优化的代码
*/
// Node tmpe = first;
// for (int i = 0; i < index; i++) {
// tmpe = tmpe.getNe();
// }
/**
* 优化的代码,选着在哪里进行开始查询
*/
Node tmpe;
int b = (size>>1);
if(index<=b) {
tmpe = first;
for(int i=0;i<index;i++) {
tmpe = tmpe.getNe();
}
}else {
tmpe = last;
for(int i=(size-1);i>index;i--) {
tmpe = tmpe.getPr();
}
}
return (E) tmpe.getElement();
}
/***
* 获取指定位置的node
* @param index
* @return
*/
public Node getNode(int index ) {
Node temp ;
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
int b = (size>>1);
if(index<=b) {
temp = first;
for(int i=0;i<index;i++) {
temp = temp.getNe();
}
}else {
temp = last;
for(int i=(size-1);i>index;i--) {
temp = temp.getPr();
}
}
return temp;
}
/***
* 直接删除指定位置的索引
* @param index
*/
public void remove(int index) {
Node temp;
Node Up;
Node down;
temp = getNode(index);
if(index==0) {
if(size==1) {
first=null;
last=null;
size--;
}else {
first = temp.getNe();
first.setPr(null);
size--;
}
}else if(index==(size-1)){
last = temp.getPr();
last.setNe(null);
size--;
}else {
Up = temp.getPr();
down = temp.getNe();
Up.setNe(temp.getPr());
down.setPr(down.getPr());
size--;
}
}
/***
* 替换指定位置的内容
* @param index
* @param obj
*/
public void replace(int index,Object obj) {
Node element = getNode(index);
element.setElement(obj);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
// sb.append();
Node tmpe = first;
while(tmpe!=null) {
sb.append(tmpe.getElement()+",");
tmpe =tmpe.getNe();
}
if(size==0) {
sb.append(']');
}
else {
sb.setCharAt(sb.length()-1, ']');
}
return sb.toString();
}
public static void main(String[] args) {
myLinkList3<String> li = new myLinkList3<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
System.out.println(li);
System.out.println(li.getElement(3));
System.out.println(li.getNode(3));
li.remove(3);
li.remove(1);
li.remove(0);
li.remove(0);
System.out.println(li);
}
}
5、优化一下代码
import myConlection.Node;
/***
* 添加remove的功能
* @author starwang
*
*/
public class myLinkList4 {
private Node first;
private Node last;
private int size;
public void add(Object obj) {
Node node = new Node(obj);
if(first==null) {
node.setNe(null);
node.setPr(null);
first = node;
last = node;
}else {
//设置本节点往前一个节点进行跳转,设置下一个跳转的对象为null
node.setPr(last);
node.setNe(null);
//设置上一个跳转的下一额对象为本对象
last.setNe(node);
last = node;
}
size++;
}
public void add(int index,Object obj) {
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
if(index==0) {
Node node = new Node(obj);
if(size==0) {
node.setNe(null);
node.setPr(null);
first = node;
last = node;
size++;
}else{
first.setPr(node);
node.setNe(first);
first = node;
size++;
}
}else if(index ==(size-1)) {
add(obj);
}else {
Node node = new Node(obj);
Node temp = getNode(index);
Node temp1 = temp.getPr();
temp.setPr(node);
temp1.setNe(node);
node.setPr(temp1.getNe());
node.setNe(temp.getPr());
size++;
}
}
/***
* 获取这个元素
* @param index
* @return
*/
public Object getElement(int index) {
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
/**
*未优化的代码
*/
// Node tmpe = first;
// for (int i = 0; i < index; i++) {
// tmpe = tmpe.getNe();
// }
/**
* 优化的代码,选着在哪里进行开始查询
*/
Node tmpe;
int b = (size>>1);
if(index<=b) {
tmpe = first;
for(int i=0;i<index;i++) {
tmpe = tmpe.getNe();
}
}else {
tmpe = last;
for(int i=(size-1);i>index;i--) {
tmpe = tmpe.getPr();
}
}
return tmpe.getElement();
}
/***
* 获取指定位置的node
* @param index
* @return
*/
public Node getNode(int index ) {
Node temp ;
if (index>(size-1)||index<-1) {
throw new RuntimeException("Out Of Range:"+(size-1)+"index:"+index);
}
int b = (size>>1);
if(index<=b) {
temp = first;
for(int i=0;i<index;i++) {
temp = temp.getNe();
}
}else {
temp = last;
for(int i=(size-1);i>index;i--) {
temp = temp.getPr();
}
}
return temp;
}
/***
* 直接删除指定位置的索引
* @param index
*/
public void remove(int index) {
Node temp;
Node Up;
Node down;
temp = getNode(index);
if(index==0) {
if(size==1) {
first=null;
last=null;
size--;
}else {
first = temp.getNe();
first.setPr(null);
size--;
}
}else if(index==(size-1)){
last = temp.getPr();
last.setNe(null);
size--;
}else {
Up = temp.getPr();
down = temp.getNe();
Up.setNe(temp.getPr());
down.setPr(down.getPr());
size--;
}
}
/***
* 替换指定位置的内容
* @param index
* @param obj
*/
public void replace(int index,Object obj) {
Node element = getNode(index);
element.setElement(obj);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
// sb.append();
Node tmpe = first;
while(tmpe!=null) {
sb.append(tmpe.getElement()+",");
tmpe =tmpe.getNe();
}
if(size==0) {
sb.append(']');
}
else {
sb.setCharAt(sb.length()-1, ']');
}
return sb.toString();
}
public static void main(String[] args) {
myLinkList4 li = new myLinkList4();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
System.out.println(li);
System.out.println(li.getElement(3));
System.out.println(li.getNode(3));
li.remove(3);
li.remove(1);
li.remove(0);
li.remove(0);
System.out.println(li);
}
}