单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
这里以对单链表举例,通过添加人物到链表中,并可以对链表中的数据进行增删改查的相关操作。
添加链表时有两种方式,第一种方式是直接将人物添加到链表的尾部,并不对其顺序进行判断。
第二种方式是通过添加人物的编号值按照升序的方式进行插入,
删除数据时,通过提供对应的人物编号即可删除。
对数据进行修改则需要传入新的节点对象,并且编号值不要动,因为遍历时是根据编号的值进行判断的。
package linkedList;
// 单链表--带头结点
public class SingleLinkedList {
public static void main(String[] args) {
SingList singList = new SingList();
HeroNode heroNode1 = new HeroNode(1,"张飞","黑脸");
HeroNode heroNode2 = new HeroNode(2,"松江","及时雨");
HeroNode heroNode3 = new HeroNode(5,"张飞","黑脸");
HeroNode heroNode4 = new HeroNode(3,"松江","及时雨");
HeroNode heroNode5 = new HeroNode(4,"张飞","黑脸");
HeroNode heroNode6 = new HeroNode(6,"松江","及时雨");
singList.add(heroNode1);
singList.add(heroNode2);
singList.addOrderBy(heroNode3);
singList.addOrderBy(heroNode4);
singList.addOrderBy(heroNode5);
singList.addOrderBy(heroNode6);
HeroNode heroNode7 = new HeroNode(6,"卢俊义","玉麒麟");
singList.update(heroNode7);
singList.delete(1);
singList.delete(5);
singList.delete(6);
singList.showList();
}
}
// 创建SingList管理英雄
class SingList{
// 创建头结点,不存放具体的数据,不要动
private HeroNode head = new HeroNode(0,"","");
// 向链表尾部添加,不判断添加顺序
public void add(HeroNode heroNode){
// 因为头结点不能动,我们通过一个辅助节点来移动
HeroNode temp = head;
while (true){
if (temp.next == null){
break;
}
temp = temp.next;
}
temp.next = heroNode;
}
// 根据编号按顺序添加,如果对应编号已存在则提示添加错误
public void addOrderBy(HeroNode heroNode){
// 因为是单链表,因此找的temp是要添加节点的前一个节点
HeroNode temp = head;
boolean flag = false; // 标志添加的编号是否存在,默认是false
while (true){
if (temp.next == null){
break;
}
if (temp.next.no>heroNode.no){ // 位置找到
break;
}else if (temp.next.no == heroNode.no){
flag = true;//说明编号存在
break;
}
temp = temp.next;
}
if (flag){
System.out.printf("不能添加编号为%d,已经存在,添加失败\n",heroNode.no);
}else {
heroNode.next = temp.next;
temp.next = heroNode;
}
}
// 修改节点的信息
// 根据newHeroNode的no来修改
public void update(HeroNode newHeroNode){
if (head.next == null){
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.no == newHeroNode.no) {
// 找到了
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = newHeroNode.name;
temp.nickName = newHeroNode.nickName;
}else {
System.out.printf("没有找到编号为%d的节点",newHeroNode.no);
}
}
// 删除节点
public void delete(int no){
if (head.next == null){
System.out.println("链表为空");
return;
}
HeroNode 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;
System.out.printf("删除编号为%d的节点\n",no);
}else {
System.out.printf("没有找到编号为%d的节点\n",no);
}
}
// 显示链表
public void showList(){
if (head.next == null){
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while (true){
if (temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
class HeroNode{
public int no;//编号
public String name;//英雄名字
public String nickName;// 英雄昵称
public HeroNode next;//指向下一个节点
public HeroNode(int hNo,String name,String nickName){
this.no = hNo;
this.name = name;
this.nickName = nickName;
}
// 重写toString方法
@Override
public String toString(){
return "HeroNode [no = "+no+" ,name = "+name+",nickName = "+nickName+"]";
}
}