链表总结
一、概念理解
链表由一系列节点组成,每个节点由两部分组成:存储数据元素的数据域、存储下一个节点地址的指针域。
特点:方便插入和删除数据。
二、创建链表的步骤(以双向链表为例)
1)创建链表的节点类
public class LinkNode{
private Object obj;//节点内的数据对象
private LinkNode child;//对下一个节点的引用
private LinkNode parent;//对上一个节点的引用
//构造函数,创建节点对象时传入数据对象
public LinkNode(Object obj){
this.obj=obj;
}
public Object getObject(){
return obj;
}
public void setObject(Object obj){
this.obj=obj;
}
public LinkNode getChild(){
return child;
}
public void setChild(LinkNode child){
this.child=child;
}
public LinkNode getParent(){
return parent;
}
public void setParent(LinkNode parent){
this.parent=parent;
}
}
2)实现一个双向链表
public class LinkList{
public static LinkNode front=null;//第一个节点
public LinkNode last=null;//最后一个节点
/*
*添加一个节点(在链表末端)
*obj为插入节点中的对象
*/
public void add(Object obj){
LinkNode node=new LinkNode(obj);
if(null==front){//如果链表为空
front=node;
last=front;
}else{
last.setChild(node);
node.setParent(last);
last=node;
}
}
/*
*在指定索引位置下插入节点
*/
public void insertIndexObj(int index,Object obj){
if(this.getLength()<index||index<0){//抛出异常
throw new java.lang.RuntimeException(“下标越界:”+index+”,size:”+this.getLength());
}else{
//创建一个新的节点
LinkNode newNode=new LinkNode(obj);
//获取当前索引位置的节点
LinkNode node=this.getLinkNode(index);
if(index==0){//如果链表没有节点
front=newNode;
}else{
//得到父节点
LinkNode fNode=node.getParent();
//设置新的引用关系
fNode.setChild(newNode);
newNode.setParent(fNode);
}
//设置新的引用关系
newNode.setChild(node);
node.setParent(newNode);
}
/*
*移除指定索引位置的节点
*/
public void deleteLinkNode(int index){
if(this.getLength()<index||index<0){//抛出异常
throw new java.lang.RuntimeException(“下标越界:”+index+”,size:”+this.getLength());
}else{
//得到当前位置的节点
LinkNode node=this.getLinkNode(index);
//得到父节点
LinkNode fNode=node.getParent();
//得到子节点
LinkNode cNode=node.getChild();
if(fNode==null){ //如果父节点为空
front=cNode;
}else if(cNode==null){ //如果子节点为空
fNode.setChild(null);
}else{
fNode.setChild(cNode);
cNode.setParent(fNode);
}
}
}
/*
*获取指定位置的节点
*/
public LinkNode getLinkNode(int index){
int num=0;
LinkNode node=front;
while(num!=index){
node=node.getChild();
num++;
}
return node;
}
/*
*获取指定数据的节点
*/
public LinkNode getLinkNode1(Object obj){
LinkNode node=front;
while(node.getObj()!=obj){
node=node.getChild();
}
return node;
}
/*
*修改指定位置的节点
*/
public void updateLinkNode(int index,Object obj){
if(this.getLength()<index||index<0){//抛出异常
throw new java.lang.RuntimeException(“下标越界:”+index+”,size:”+this.getLength());
}else{
//获取索引位置的节点
LinkNode node=this.getLinkNode(index);
node.setObj(obj);
}
}
/*
*得到链表的长度
*/
public int getLength(){
int count=0;
if(front==null){
return count;
}
LinkNode node=front;
while(null!=node){
node=node.getChild();
count++;
}
return count;
}
/*
*遍历链表
*/
public void printLinkNode(LinkNode root){
if(null!=root){
Object date=root.getObj();
System.out.println(date);
LinkNode temp=root.getChild();
printLinkNode(temp);
}
}
}
一、概念理解
链表由一系列节点组成,每个节点由两部分组成:存储数据元素的数据域、存储下一个节点地址的指针域。
特点:方便插入和删除数据。
二、创建链表的步骤(以双向链表为例)
1)创建链表的节点类
public class LinkNode{
private Object obj;//节点内的数据对象
private LinkNode child;//对下一个节点的引用
private LinkNode parent;//对上一个节点的引用
//构造函数,创建节点对象时传入数据对象
public LinkNode(Object obj){
this.obj=obj;
}
public Object getObject(){
return obj;
}
public void setObject(Object obj){
this.obj=obj;
}
public LinkNode getChild(){
return child;
}
public void setChild(LinkNode child){
this.child=child;
}
public LinkNode getParent(){
return parent;
}
public void setParent(LinkNode parent){
this.parent=parent;
}
}
2)实现一个双向链表
public class LinkList{
public static LinkNode front=null;//第一个节点
public LinkNode last=null;//最后一个节点
/*
*添加一个节点(在链表末端)
*obj为插入节点中的对象
*/
public void add(Object obj){
LinkNode node=new LinkNode(obj);
if(null==front){//如果链表为空
front=node;
last=front;
}else{
last.setChild(node);
node.setParent(last);
last=node;
}
}
/*
*在指定索引位置下插入节点
*/
public void insertIndexObj(int index,Object obj){
if(this.getLength()<index||index<0){//抛出异常
throw new java.lang.RuntimeException(“下标越界:”+index+”,size:”+this.getLength());
}else{
//创建一个新的节点
LinkNode newNode=new LinkNode(obj);
//获取当前索引位置的节点
LinkNode node=this.getLinkNode(index);
if(index==0){//如果链表没有节点
front=newNode;
}else{
//得到父节点
LinkNode fNode=node.getParent();
//设置新的引用关系
fNode.setChild(newNode);
newNode.setParent(fNode);
}
//设置新的引用关系
newNode.setChild(node);
node.setParent(newNode);
}
/*
*移除指定索引位置的节点
*/
public void deleteLinkNode(int index){
if(this.getLength()<index||index<0){//抛出异常
throw new java.lang.RuntimeException(“下标越界:”+index+”,size:”+this.getLength());
}else{
//得到当前位置的节点
LinkNode node=this.getLinkNode(index);
//得到父节点
LinkNode fNode=node.getParent();
//得到子节点
LinkNode cNode=node.getChild();
if(fNode==null){ //如果父节点为空
front=cNode;
}else if(cNode==null){ //如果子节点为空
fNode.setChild(null);
}else{
fNode.setChild(cNode);
cNode.setParent(fNode);
}
}
}
/*
*获取指定位置的节点
*/
public LinkNode getLinkNode(int index){
int num=0;
LinkNode node=front;
while(num!=index){
node=node.getChild();
num++;
}
return node;
}
/*
*获取指定数据的节点
*/
public LinkNode getLinkNode1(Object obj){
LinkNode node=front;
while(node.getObj()!=obj){
node=node.getChild();
}
return node;
}
/*
*修改指定位置的节点
*/
public void updateLinkNode(int index,Object obj){
if(this.getLength()<index||index<0){//抛出异常
throw new java.lang.RuntimeException(“下标越界:”+index+”,size:”+this.getLength());
}else{
//获取索引位置的节点
LinkNode node=this.getLinkNode(index);
node.setObj(obj);
}
}
/*
*得到链表的长度
*/
public int getLength(){
int count=0;
if(front==null){
return count;
}
LinkNode node=front;
while(null!=node){
node=node.getChild();
count++;
}
return count;
}
/*
*遍历链表
*/
public void printLinkNode(LinkNode root){
if(null!=root){
Object date=root.getObj();
System.out.println(date);
LinkNode temp=root.getChild();
printLinkNode(temp);
}
}
}