数据结构与算法 :单链表
1.单链表的概念
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
2.结构
每个结点包含data域,next域。
┌───┬───┐
│data │next │
└───┴───┘
data域–存放结点值的数据域
next域–存放结点的直接后继的地址(位置)的指针域(链域)
链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,每个结点只有一个链域的链表称为单链表(Single Linked List)。
3.头指针head和终端结点
单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。
终端结点无后继,故终端结点的指针域为空,即NULL。
4.单链表的增删查改
利用水浒传英雄排行榜对人物进行增删查改操作
1). 添加(创建)
1.先创建一个头结点,作用是表示单链表的头
2.后面我们每添加一个结点,就直接加到链表的最后
遍历:
通过一个辅助变量遍历,帮助遍历整个链表
class SingleLinkedList{
private HeroCode head=new HeroCode(0,"","");
public void add(HeroCode heroCode){
HeroCode temp=head;
while(true){
if (temp.next==null){
break;
}
temp=temp.next;
}
temp.next=heroCode;
}
public void list(){
if (head.next==null){
System.out.println("链表为空");
return;
}
HeroCode temp=head.next;
while (true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
2). 在添加英雄时,根据排名将英雄插入指定位置
按照顺序编号添加
1.首先找到新添加的结点的位置,通过辅助变量(指针)和遍历来搞定
2.新的结点.next=temp.next;
3.新temp.next=新的结点
public void addByOrder(HeroCode heroCode){
HeroCode temp=head;
boolean flag=false;
while (true){
if (temp.next==null){
break;
}
if (temp.next.no>heroCode.no){
break;
}
else if (temp.next.no==heroCode.no){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
System.out.printf("英雄的编号%d存在,不能添加\n",heroCode.no);
}else {
heroCode.next=temp.next;
temp.next=heroCode;
}
}
3).修改结点
1.先找到该节点,进行遍历
2.然后直接修改信息
public void update(HeroCode newHeroCode){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroCode temp=head.next;
boolean flag =false;
while (true){
if(temp==null){
System.out.println("链表遍历完");
break;
}
if (temp.no==newHeroCode.no){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
temp.name= newHeroCode.name;
temp.nickname= newHeroCode.nickname;
}else{
System.out.printf("没有找到编号%d的结点,不能修改\n", newHeroCode.no);
}
}
4).删除结点
1.先要找到需要删除的结点的前一个结点的temp(辅助变量)
2.temp.next=temp.next.next;
3.被删除的结点,将不会有其他引用指向,会被垃圾回收机制回收
public void del(int no){
HeroCode temp=head;
boolean flag=false;
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.printf("删除的编号%d不存在\n",no);
}
}
完整的代码如下 :
package 链表;
public class SingleLinkedListTest {
public static void main(String[] args) {
HeroCode heroCode1=new HeroCode(1,"宋江","及时雨");
HeroCode heroCode2=new HeroCode(2,"卢俊义","玉麒麟");
HeroCode heroCode3=new HeroCode(3,"吴用","智多星");
HeroCode heroCode4=new HeroCode(4,"林聪","豹子头");
SingleLinkedList singleLinkedList=new SingleLinkedList();
singleLinkedList.addByOrder(heroCode1);
singleLinkedList.addByOrder(heroCode4);
singleLinkedList.addByOrder(heroCode2);
singleLinkedList.addByOrder(heroCode3);
singleLinkedList.list();
HeroCode newHeroCode=new HeroCode(2,"小卢","玉麒麟");
singleLinkedList.update(newHeroCode);
System.out.println("--------------------");
singleLinkedList.list();
singleLinkedList.del(1);
System.out.println("删除过后的信息");
singleLinkedList.list();
}
}
class SingleLinkedList{
private HeroCode head=new HeroCode(0,"","");
public void add(HeroCode heroCode){
HeroCode temp=head;
while(true){
if (temp.next==null){
break;
}
temp=temp.next;
}
temp.next=heroCode;
}
public void addByOrder(HeroCode heroCode){
HeroCode temp=head;
boolean flag=false;
while (true){
if (temp.next==null){
break;
}
if (temp.next.no>heroCode.no){
break;
}
else if (temp.next.no==heroCode.no){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
System.out.printf("英雄的编号%d存在,不能添加\n",heroCode.no);
}else {
heroCode.next=temp.next;
temp.next=heroCode;
}
}
public void update(HeroCode newHeroCode){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroCode temp=head.next;
boolean flag =false;
while (true){
if(temp==null){
System.out.println("链表遍历完");
break;
}
if (temp.no==newHeroCode.no){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
temp.name= newHeroCode.name;
temp.nickname= newHeroCode.nickname;
}else{
System.out.printf("没有找到编号%d的结点,不能修改\n", newHeroCode.no);
}
}
public void del(int no){
HeroCode temp=head;
boolean flag=false;
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.printf("删除的编号%d不存在\n",no);
}
}
public void list(){
if (head.next==null){
System.out.println("链表为空");
return;
}
HeroCode temp=head.next;
while (true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
class HeroCode{
public int no;
public String name;
public String nickname;
public HeroCode next;
public HeroCode(int no,String name ,String nickname){
this.no=no;
this.name=name;
this.nickname=nickname;
}
@Override
public String toString() {
return "HeroNode[no="+ no +",name="+name+",nickname="+nickname+"]";
}
}
|