链表总结
之前在学校数据结构这门课中就有学过链表——单链表与双向链表,但都是在C语言的情况下实现的,现在在JAVA的环境下虽然原理基本相同但在语言的实现方面还是有一定的差异。链表比起数组有其自身的很多优点,数组的特点是长度和元素的类型是固定的,但这也是它的缺点,对于元素的插入和删除就麻烦多了,而链表正好能弥补它的这些缺点,只要改变其的结点引用就可以了。链表中结点是一个很重要的概念,每个结点包括两部分,一个是存储数组的数据域一个是存储下一个结点位置的指针域。而双向链表相对于单向链表,结点除了数组域外还有前指针域和后指针域。
再来说说数组队列与链表队列,从整体而言链表队列添加元素比数组队列方便,若从最后添加元素则数组队列较链表队列方便。
下面是双链表的增、删、改、查的实现:
//添加元素方法
public void add(Object obj){
//创建结点对象
Node node=new Node(obj);
//判断条件
//若队列为空
if(null==first){
first=node;
last=node;
}else{
//从链表尾加入
last.setchild(node);
node.setparent(last);
last=node;
}
}
//获取指定位置元素的方法
public Node get(int index){
System.out.println(this.getLength());
//判断条件,队满或队空,则抛出异常
if(index<0||index>this.getLength()){
throw new RuntimeException("下标越界了!");
}else{
//得到地址
Node node=first;
int count=0;
//当地址不为满时即依次遍历得到指定位置元素
while(count!=index){
//得到下一个结点的位置
node=node.getchild();
count++;
}
return node;
}
}
//删除方法
public void deleteList(int index){
//判断条件——抛出异常,看是否越界
if(index<0||index>this.getLength()){
throw new RuntimeException("下标越界了!");
}else{
//得到根据索引地址得到的元素值
Node node=this.get(index);
//根据索引得到父结点与子结点
Node fnode=node.getparent();
Node cnode=node.getchild();
//判断条件,根据条件进行删除设置
//若父节点是空的,则第一个结点便是子节点
if(fnode==null){
first=cnode;
}
//若子节点是空的,则父节点的下一个结点(即父节点的孩子结点)便是空的
if(cnode==null){
fnode.setchild(null);
}//其他情况下
else{
fnode.setchild(cnode);
cnode.setparent(fnode);
}
}
}
//根据索引修改得到元素的内容
public void updateList(int index,Object obj){
//判断条件若超出长度则越界
if(index<0||index>this.getLength()){
throw new RuntimeException("下标越界了!");
}else{
//得到当前结点的内容
Node node=this.get(index);
//所修改成的内容
node.setobj("困了就睡呗!");
}
}