链表
链表介绍
链表是有序的列表,但是它在内存中是存储如下
1、链表是以节点的方式来存储,是链式存储
2、每个节点包含 data 域, next 域:指向下一个节点.
3、如上图:发现链表的各个节点不一定是连续存储.
4、链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
单链表(带头结点) 逻辑结构示意图如下
单链表的应用实例
使用带head头的单向链表实现 –水浒英雄排行榜管理
1、完成对英雄人物的增删改查操作
2、第一种方法在添加英雄时,直接添加到链表的尾部
3、第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)
代码实现
class HeroNode{
public int no;
public String name;
public String nickname;
public HeroNode next;
public HeroNode(){
}
public HeroNode(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 + '\'' +
+
'}';
}
}
//链表API
class SingleLinkedList{
private HeroNode head=new HeroNode(0,"","");
public HeroNode getHead(){
return head;
}
//1、无序添加节点
public void addNode(HeroNode node){
HeroNode temp=head;
while (true){
if (temp.next==null){
break;
}
temp=temp.next;
}
temp.next=node;
}
//2、有序添加节点
public void addNodeOrder(HeroNode node){
HeroNode temp=head;
boolean flag=false;
while (true){
//如果元素为空,直接插入
if (temp.next==null){
break;
}
else if (temp.next.no>node.no){
break;
}else if (temp.next.no==node.no){//节点已经存在
flag=true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println(node.no+"节点已经存在");
}else {
node.next=temp.next;
temp.next=node;
}
}
//删除节点
public void del(int no){
HeroNode temp=head;
boolean flag=true;
while (true){
if (temp.next==null){
break;
}else if (temp.next.no==no){
flag=false;
break;
}
temp=temp.next;
}
if (!flag){
temp.next=temp.next.next;
}else {
System.out.println("没有找到要删除的编号");
}
}
//修改节点
public void update(HeroNode newnode){
HeroNode temp=head.next;
boolean flag=true;
while (true){
if (temp==null){
System.out.println("链表为空");
break;
}else if (temp.next.no==newnode.no){
flag=false;
break;
}
temp=temp.next;
}
if (!flag){
temp.name=newnode.name;
temp.nickname=newnode.nickname;
}
}
//展示链表
public void showList(){
HeroNode temp=head.next;
if (head.next==null){
System.out.println("链表为空");
}
while(true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
//主函数
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode heroNode3 = new HeroNode(9, "吴用", "智多星");
HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
HeroNode heroNode5 = new HeroNode(11, "林冲", "豹子头");
SingleLinkedList sll = new SingleLinkedList();
// sll.addNode(heroNode1);
// sll.addNode(heroNode2);
// sll.addNode(heroNode3);
// sll.addNode(heroNode4);
// sll.addNode(heroNode5);
// sll.showList();
sll.addNodeOrder(heroNode1);
sll.addNodeOrder(heroNode2);
sll.addNodeOrder(heroNode3);
sll.addNodeOrder(heroNode4);
sll.addNodeOrder(heroNode5);
sll.showList();
sll.del(1);
sll.showList();
sll.update(new HeroNode(4,"xxx","zhou"));
sll.showList();
}