这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的节点,链表。
下面我主要说明5个操作:增加元素(两种),查找元素,更新元素,删除元素,遍历单链表中的元素。
第一部分.单链表的介绍
在我们平时的使用中,通过数组我们可以快速的存储元素,链表也是和数组一样可以用来存储元素,但是链表在一些方面比数组的效率更高,在查找元素的时候我们通常用数组来存储,但是当我们插入和删除元素的时候,通常我们使用链表来进行操作。链表我们通常定义有两个域:数据域和指针域。数据域存储的是我们要存储的数据,指针域存储的是我们要指向下一个地址的指针。
单链表的存储方式:单链表的存储方式如下:

单链表的每个元素的存储空间不是连续的,我们只能通过第一个数据的指针找到下一个元素的位置,之后才能进行访问。这里面在链表中我们通常加一个head(头指针),这个头指针可以方便我们对链表头元素的插入和删除,它仅仅代表一个标志,里面可以写上链表的长度等等。
带表头的单链表的逻辑示意图如下:

第二部分.单链表的操作
节点的创建:
class HeroNode{
public int no;
public String name;
public String nickname;
public HeroNode next;
public HeroNode(int no,String name,String nickname){
this.no = no;
this.name = name;
this.nickname = nickname;
}
public String toString(){
return "HeroNode[no="+no+"\t"+"name="+name+"\t"+"nickname="+nickname+"]";
}
}
单链表的创建(我会在这里面加入各种操作,通过注释讲解)
class LinkedList{
//创建头结点,将第一个头结点定义成私有的。
private HeroNode head = new HeroNode(0,"","");
//返回头结点,这里面直接调用get,set即可。
public HeroNode getHead() {
return head;
}
//在链表的最后添加元素
public void add(HeroNode heronode){
//找一个辅助变量temp来遍历
HeroNode temp = head;
while(true){
if(temp.next == null){
break;
}
//这个地方要注意,每次都要往后移一个单位,否则就是死循环了。
temp = temp.next;
}
temp.next = heronode;
}
//在链表中按照编号的顺序添加
public void addOrderBy(HeroNode heronode){
HeroNode temp = head;
boolean flag = false;
while(true){
if(temp.next == null){
break;
}
if(heronode.no<temp.next.no){
break;
}else if(heronode.no == temp.next.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.println("编号已经存在,不能添加");
return;
}else{
//在链表中插入元素的步骤,重点代码!!!
heronode.next = temp.next;
temp.next = heronode;
}
}
//在链表中根据编号修改元素,相当于就是查找
public void update(int no){
HeroNode temp = head.next;
boolean flag = false;
while(true){
if(temp.next == null){
break;
}
if(temp.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = "xiao";
temp.nickname = "xiao";
}else{
System.out.println("没有找到要修改的元素");
return;
}
}
//在链表中根据编号删除元素
public void del(int no){
boolean flag = false;
if(head.next == null){
System.out.println("该链表为空");
return;
}
HeroNode temp = head;
while(true){
if(temp.next == null){
break;
}
if(temp.next.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
//链表中删除元素的重要步骤!!!
temp.next = temp.next.next;
}else{
System.out.println("没有找到待删除元素的编号");
return;
}
}
//遍历链表,显示链表中的每个元素
public void list(){
if(head.next == null){
System.out.println("该链表中的元素为空");
return;
}else{
HeroNode temp = head.next;
while(true){
if(temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
}
以上就是单链表的增删改查的操作,如果有问题可以留言~
原文:https://www.cnblogs.com/liuzengzhi/p/11726144.html