今天学习了链表,简单说一下自己的心得体会吧
一、定义
同队列、集合相类似,链表是一种无序、不连续的存储结构,而其中的存储顺序是通过链表中的指针连接次序实现的。链表有一系列的节点组成,节点不具有固定长度,可以随时添加或删除。链表通常由两部分组成,一个是存储数据元素的数据域,另一个是存数下一个节点地址的指针域。而双链表具有两个链域,一个存储子节点的地址,称为右链域,一个存储父节点的地址,称为左链域。链表的突出优点是,可以比较方便的插入和删除操作。
分类:java中的链表可以分为单向链表、双向链表和环形链表。
单向链表只能从头至尾进行检索,双向链表可以向上或向下两个方向进行检索,而环形链表则是将双链表首尾相连,任何 一个元素沿任何一个方向,都可以检索所有元素。
链表中的元素通常设为object类,因为object类是所有类的超类,任何数据类型的元素都可以存入其中。
下面是我实现链表的查找、插入、删除、修改等基本功能的代码。
package 链表;
/**
* 链表节点类
* @author Administrator
*
*/
public class LinkNode {
//节点内的数据对象
private Object obj;
//对下一结点的引用
private LinkNode child;
private LinkNode parent;
public LinkNode(Object obj){
this.obj = obj;
}
public void setObj(Object obj){
this.obj = obj;
}
public Object getObj(){
return obj;
}
public void setChild(LinkNode child){
this.child = child;
}
public LinkNode getChild(){
return child;
}
public void setParent(LinkNode parent){
this.parent = parent;
}
public LinkNode getParent(){
return parent;
}
}
/**
* 双向链表
* @author Administrator
*
*/
public class LinkList {
private static LinkNode head = null;
private static LinkNode foot = null;
public static void main(String []args){
LinkList list = new LinkList();
list.createLink();
list.reSet("新来的",0);
// list.delete(2);
list.printLinkList(head);
int i = list.length();
//LinkNode node = list.getLinkNode(3);
System.out.println("&&&&&&&"+i);
}
/**
* 手工创建一个链表
* @return
*/
public LinkNode createLink(){
head = new LinkNode("根节点");
LinkNode head1 = new LinkNode("节点一");
LinkNode head2 = new LinkNode("节点二");
LinkNode head3 = new LinkNode("节点三");
head.setChild(head1);
head1.setParent(head);
head1.setChild(head2);
head2.setParent(head1);
head2.setChild(head3);
head3.setParent(head2);
/**********************尾结点要赋值*************************/
foot = head3;
// head3.setChild(foot);
//foot.setParent(head3);
return head;
}
/**
* 增加一个新节点
*/
public void add(Object obj){
LinkNode node = new LinkNode(obj);
if(head == null ){
head = node;
foot = head;
}else{
foot.setChild(node);
node.setParent(foot);
foot = node;
}
}
/**
* 获取长度
* @return
*/
public int length(){
int count = 0;
if(head == null){
return count;
}
LinkNode node = head.getChild();
while(node!=null){
count++;
node = node.getChild();
}
return count+1;
}
/**
* 获取指定位置的节点
*/
public LinkNode getLinkNode(int index){
if(index ==0){
return head;
}
int i = 1;
LinkNode node = head.getChild();
while(i!=index){
node = node.getChild();
i++;
}
return node;
}
/**
* 在指定位置增加新节点
* @param obj :链表中的元素
* @param index :要插入节点的位置
*/
public void add(Object obj ,int index){
while(index>length()||index<0){
throw new java.lang.RuntimeException("下标越界:"+index+",size:"+length());
}
LinkNode node = new LinkNode(obj);
if(index ==0){
if(head ==null){
head =node;
}else{
node.setChild(head);
System.out.println("<<<<<<<<<<<<<<");
head.setParent(node);
head = node;
}
}else{
LinkNode node2 = this.getLinkNode(index);
LinkNode fnode = node2.getParent();
fnode.setChild(node);
node.setParent(fnode);
node.setChild(node2);
node2.setParent(node);
}
}
/**
* 删除指定位置的节点
* @param index
*/
public void delete(int index){
while(index>length()||index<0){
throw new java.lang.RuntimeException("下标越界:"+index+",size:"+length());
}
LinkNode node = this.getLinkNode(index);
LinkNode fnode = node.getParent();
LinkNode cnode = node.getChild();
if(fnode == null){
head = cnode;
}else if(cnode == null){
foot =fnode;
}else{
fnode.setChild(cnode);
cnode.setParent(fnode);
}
}
/**
* 修改指定位置节点
* @param index:所修改节点的位置
*/
public void reSet(Object obj,int index){
while(index>this.length()||index<0){
throw new java.lang.RuntimeException("下标越界"+index+",size:"+length());
}
LinkNode newnode = new LinkNode(obj);
if(index ==0){
if(head ==null){
head =newnode;
}else{
LinkNode cnode = head.getChild();
newnode.setChild(cnode);
cnode.setParent(newnode);
/***********************注意为链表头赋值******************************************/
head =newnode;
}
}else{
LinkNode node = this.getLinkNode(index);
LinkNode cnode = node.getChild();
LinkNode fnode = node.getParent();
fnode.setChild( newnode);
newnode.setParent(fnode);
newnode.setChild(cnode);
cnode.setParent(newnode);
}
}
/**
* 遍历链表
* @param foot:链表根节点
*/
public void printLinkList(LinkNode nodel){
if(nodel!=null){
Object obj = nodel.getObj();
System.out.println(obj);
LinkNode node = nodel.getChild();
printLinkList(node);
}
}
}
链表与其它数据结构相比,给我最大的感觉就是,他很容易进行数据的查找、增加删除等操作,方便灵活,为很多管理系统的制作提供了很大的方便