package com.chb.lianbiao;
public class danlianbiao {
public static void main(String[] args) {
SingleLinkedList list=new SingleLinkedList();
list.add2(new HeroNode(1,"宋江","及时雨"));
list.add2(new HeroNode(2,"卢俊义","玉麒麟"));
list.add2(new HeroNode(4,"林冲","豹子头"));
list.add2(new HeroNode(3,"吴用","智多星"));
list.show();
System.out.println("++++++++++++++++++++++++++++++++++++");
list.update(new HeroNode(1,"小江","及时雨"));
list.show();
System.out.println("++++++++++++++++++++++++++++++++++++");
list.delete(1);
list.show();
}
}
//定义SingleLinkedList,管理英雄
class SingleLinkedList {
// 初始化头结点,不存放具体的数据
private HeroNode head = new HeroNode(0, "", "");
// 无顺序的添加
// 当不考虑编号顺序时,找到当前链表的最后节点,将最后节点的next指向这个节点
public void add(HeroNode heroNode) {
// 因为head不能动,所以需要一个辅助节点temp遍历
HeroNode temp = head;
// 遍历链表,找到最后
while (true) {
// 找到了最后
if (temp.next == null) {
break;
}
// 如果没有找到,就将temp后移
temp = temp.next;
}
// 当退出循环时,temp就指向了链表的最后
temp.next = heroNode;
}
//有顺序的添加
public void add2(HeroNode heroNode) {
// 因为head不能动,所以需要一个辅助节点temp遍历
HeroNode temp = head;
boolean flag=false;//标识添加节点的编号是否存在
while(true) {
if(temp.next==null) {//temp已经是最后
break;
}
if(temp.next.no>heroNode.no) {//位置找到,就在temp的后面加入
break;
}else if(temp.next.no==heroNode.no) {//已经存在
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
System.out.println("插入的英雄编号已经存在,不能加入");
}else {
//加入到temp后面
heroNode.next=temp.next;
temp.next=heroNode;
}
}
//修改节点的信息,根据编号更改,编号不能改变
public void update(HeroNode heroNode) {
//判断是否为空
if(head.next==null) {
System.out.println("链表为空");
return;
}
//找到需要修改的节点,根据no
//先定义一个辅助节点
HeroNode temp=head.next;
boolean flag=false;//表示是否找到
while(true) {
if(temp==null) {
break;//表示到了链表最后
}
if(temp.no==heroNode.no) {
//找到了
flag=true;
break;//找到了
}
temp=temp.next;
}
if(flag) {
temp.name=heroNode.name;
temp.nickname=heroNode.nickname;
}else {
System.out.println("没有找到");
}
}
//删除节点
public void delete(int no) {
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;
}else {
System.out.println("要删除的节点不存在");
}
}
// 显示链表
public void show() {
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 no, String name, String nickname) {
super();
this.no = no;
this.name = name;
this.nickname = nickname;
}
// 为了显示方便,重写toString
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
运行结果
package com.chb.lianbiao;
public class shuangxianglianbiao {
public static void main(String[] args) {
DoubleLinekdList list2=new DoubleLinekdList();
list2.add(new HeroNode2(1,"宋江","及时雨"));
list2.add(new HeroNode2(2,"卢俊义","玉麒麟"));
list2.add(new HeroNode2(4,"林冲","豹子头"));
list2.add(new HeroNode2(3,"吴用","智多星"));
list2.show();
System.out.println("++++++++++++++++++++++++++++++++++++");
list2.update(new HeroNode2(1,"小江","及时雨"));
list2.show();
System.out.println("++++++++++++++++++++++++++++++++++++");
list2.delete(1);
list2.show();
}
}
class DoubleLinekdList{
// 初始化头结点,不存放具体的数据
private HeroNode2 head = new HeroNode2(0, "", "");
//返回头结点
public HeroNode2 gethead() {
return head;
}
//遍历双向链表
public void show() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode2 temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
//添加
public void add(HeroNode2 HeroNode2) {
// 因为head不能动,所以需要一个辅助节点temp遍历
HeroNode2 temp = head;
// 遍历链表,找到最后
while (true) {
// 找到了最后
if (temp.next == null) {
break;
}
// 如果没有找到,就将temp后移
temp = temp.next;
}
// 当退出循环时,temp就指向了链表的最后
temp.next = HeroNode2;
HeroNode2.pre=temp;
}
//修改
public void update(HeroNode2 HeroNode2) {
// 判断是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 找到需要修改的节点,根据no
// 先定义一个辅助节点
HeroNode2 temp = head.next;
boolean flag = false;// 表示是否找到
while (true) {
if (temp == null) {
break;// 表示到了链表最后
}
if (temp.no == HeroNode2.no) {
// 找到了
flag = true;
break;// 找到了
}
temp = temp.next;
}
if (flag) {
temp.name = HeroNode2.name;
temp.nickname = HeroNode2.nickname;
} else {
System.out.println("没有找到");
}
}
//删除
public void delete(int no) {
if(head.next==null) {
System.out.println("链表为空,不能删除");
return;
}
HeroNode2 temp=head.next;
boolean flag=false;//标识是否找到待删除的节点
while(true) {
if(temp==null) {
break;
}
if(temp.no==no) {
//找到了待删除节点的前一个节点
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.pre.next=temp.next;
//如果是最后一个节点,则下面的不需要执行,否则会出现空指针异常
if(temp.next!=null) {
temp.next.pre=temp.pre;
}
}else {
System.out.println("要删除的节点不存在");
}
}
}
class HeroNode2 {
public int no;
public String name;
public String nickname;
public HeroNode2 next;// 指向下一个节点,默认为null
public HeroNode2 pre;// 指向钱前下一个节点,默认为null
public HeroNode2(int no, String name, String nickname) {
super();
this.no = no;
this.name = name;
this.nickname = nickname;
}
// 为了显示方便,重写toString
@Override
public String toString() {
return "HeroNode2 [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
运行结果: