单向链表的运算操作。
//链结点的封装类
public class Link {
public int age;
public Link next; //指向该链结点的下一个链结点
//构造方法
public Link(int age){
this.age = age;
}
//打印该链结点的信息
public void displayLink(){
System.out.println("age:"+age);
}
//打印该结点下的所有结点的信息
public void printlnLink(Link link){
link.displayLink();
if(link.next != null){
printlnLink(link.next);
}
}
//while循序打印,和上面打印结果的一样
public void printlnLink(Link link){
while(link != null){
link.displayLink();
link = link.next;
}
}
}
//链表的封装类
public class LinkList {
public static void main(String[] args) {
//插入结点
LinkList linkList = new LinkList();
linkList.insertFirst(new Link(1));
linkList.insertFirst(new Link(2));
linkList.insertFirst(new Link(3));
//删除结点,打印该结点以及结点下的所有数据
Link link = linkList.deleteFirst();
link.printlnLink(link);
}
private Link first; //指向链表中的第一个链结点
public LinkList(){
first = null;
}
//插入到链表的前端
public void insertFirst(Link link){
/**
*将已存在的结点赋值给新的结点的指针域中,新的结点已经改变,而原先的结点并没有改变
* 然后将新的结点赋值给原先的结点,这样就完成了结点的插入,这样插入的设计的很巧妙
*/
link.next = first;
first = link;
}
//删除第一个链结点,返回删除的链结点引用
public Link deleteFirst() throws Exception{
if(isEmpty()){
throw new Exception("链表为空!不能进行删除操作");
}
/**
* 删除的并不一定是一个结点,只是取到了第一个结点的值
* 该结点的指针域可能不为空,调用自定义方法printlnLink打印该结点及该结点下所有结点的数据
*/
Link temp = first;
first = first.next;
return temp;
}
//删除属性为指定值的链结点
public Link deleteByKey(int key){
Link link = null; //要删除的结点
Link cur = first; //当前结点
Link next = first.next; //后结点
Link previous = null; //前结点
while(cur != null){
if(cur.age == key){ //找到了要删除的链结点
link = cur;
//如果当前链结点的前驱为null,证明当其为链表的第一个链结点,删除该链结点后需要对first属性重新赋值
if(previous ==null){
this.first =next;
}else{
//删除操作,即将前驱的next指针指向当前链结点的next,链表中将去当前链结点这一环
previous.next= next;
}
break;
}else if(cur.next ==null){ //当前链结点不是目标且下一个链结点为null,证明没有要删除的链结点
break;
}
//当前链结点不是要删除的目标,则向后继续寻找
next = next.next;
/**
*每一次previous的指针指向当前结点的上一个结点,当更改previous时候
* 指针指向的地址的值也会发生改变,进而first中改地址中的值也会发生相应的改变
*/
previous = cur;
cur = cur.next;
}
return link;
}
//查找属性为指定值的链结点
public Link find(int key){
Link link = null;
Link cur = first;
while(cur != null){
if(cur.age == key){
link = cur;
break;
}else if(cur.next == null){
break;
}
cur = cur.next;
}
return link;
}
//判空
public boolean isEmpty(){
return (first == null);
}
}
插入结点目录结构:
删除结点的数据信息: