/**
* 定义HeroNode链表子节点
*/
public class HeroNode {
int value;
Stringname;
HeroNodenext;
public HeroNode(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public StringtoString() {
return "HeroNode{" +
"value=" +value +
", name='" +name +'\'' +
'}';
}
}
public class SingleLinkList {
//首先初始化一个头节点
HeroNodehead =new HeroNode(0, "");
//添加节点到单链表
/**
* 实现思路,当不考虑编号数据时:
* 1 找到当前节点的最后一个节点
* 2 把最后这个节点的next,指向新的节点
*/
public void add(HeroNode heroNode) {
//因为head节点不能动,所以需要一个辅助遍历节点
HeroNode temp =head;
//遍历链表,找到最后
while (true) {
//如果temp.next==null,则找到
if (temp.next ==null) {
break;
}
//如果没有找到,temp节点后移
temp = temp.next;
}
//当退出循环时,temp节点就指向了链表的最后
//将最后的节点指向新的节点即可
temp.next = heroNode;
}
/**
* 显示链表
*/
public void list() {
//判断当前链表是否为空
if (head.next ==null) {
System.out.println("当前链表为空:");
return;
}
//因为head节点不能动,所以需要一个辅助变量temp
HeroNode temp =head.next;
while (true) {
if (temp ==null) {
break;
}
//输出当前节点
System.out.println(temp);
//将temp后移
temp = temp.next;
}
}
//将子节点按顺序插入到链表中
/**
* 实现思路:
* 1 每次插入时,最后一个位置
* 或找到了heroNode.value
* 或相等的位置
* 跳出循环,否则节点继续后移寻找
* 2 相等的提示已存在
* 3 不相等的
*/
public void addByOrder(HeroNode heroNode) {
//因为head节点不能动,所以需要声明一个临时节点
HeroNode temp =head;
boolean flag =false;//判断链表中是否有相同值得元素,默认是false
while (true) {
//说明temp已经在链表的最后
if (temp.next ==null) {
break;
}
//位置找到,就在temp的后面插入
if (temp.next.value > heroNode.value) {
break;
}
//说明添加的编号已经存在
else if (temp.next.value == heroNode.value) {
flag =true;
break;
}
temp = temp.next;//后移,遍历链表
}
//判断flag值
if (flag) {
System.out.println("插入的值链表中已存在:" + heroNode.value);
}else {
//插入到链表中
heroNode.next = temp.next;
temp.next = heroNode;
}
}
/**
* 修改节点信息,根据value修改-value值不能改变
*/
public void update(HeroNode newHeroNode) {
//判断链表是否为空
if (head.next ==null) {
System.out.println("当前链表为空:");
return;
}
//定义一个辅助变量
HeroNode temp =head;
boolean flag =false;
while (true) {
if (temp.value == newHeroNode.value) {
flag =true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = newHeroNode.name;
}else {
System.out.println("未找到该节点:" + newHeroNode.value);
}
}
/**
* 删除节点
* 切记是当前节点的下一个节点的值与 value进行的比较
* 这样才能持有待删节点的上一个节点,以实现跳过当前节点的删除
*/
public void delete(int value) {
HeroNode temp =head;
boolean flag =false;//标志是否找到
while (true) {
if (temp.next.value == value) {
flag =true;//已经找到
break;
}
temp = temp.next;//遍历
}
if (flag) {
//删除
temp.next = temp.next.next;
}else {
System.out.println("未找到删除的节点:" + value);
}
}
}
测试代码:
@Test
public void testLink() {
//测试
//创建5个节点
HeroNode hero1 =new HeroNode(1, "a");
HeroNode hero2 =new HeroNode(2, "b");
HeroNode hero3 =new HeroNode(3, "c");
HeroNode hero4 =new HeroNode(4, "d");
HeroNode hero5 =new HeroNode(5, "e");
//创建链表
SingleLinkList singleLinkList =new SingleLinkList();
singleLinkList.add(hero1);
singleLinkList.add(hero2);
singleLinkList.add(hero3);
singleLinkList.add(hero4);
singleLinkList.add(hero5);
// singleLinkList.addByOrder(hero1);
// singleLinkList.addByOrder(hero4);
// singleLinkList.addByOrder(hero2);
// singleLinkList.addByOrder(hero5);
// singleLinkList.addByOrder(hero3);
// singleLinkList.addByOrder(hero5);
// //更新某个元素
// singleLinkList.update(new HeroNode(3, "cc"));
//
// //删除某个元素
// singleLinkList.delete(3);
//显示
singleLinkList.list();
}
参考:https://www.jianshu.com/p/529a4c918806