这篇文章主要讲解了通过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; } } } }
以上就是单链表的增删改查的操作,如果有问题可以留言~