举一个例子:
我们小时候玩儿的积木拼接,它是前凸后凹的,能进行很好的连接。 某一天晚上,爸爸买回来一盒积木,并且这些积木都是一样的,想要搭建好这些积木,我就需要进行拼接!
package Demo7;
import Demo6.SingleLinkedList;
public class Demo {
public static void main(String[] args) {
//先添加数据
Hero h1 = new Hero(0,"张三");
Hero h2 = new Hero(1,"李四");
Hero h3 = new Hero(2,"王五");
Hero h4 = new Hero(4,"c");
Hero h5 = new Hero(3,"cc");
//创建一个对象去管理,将上述数据进行整合
StringleLinked s = new StringleLinked();
s.addby(h1);
s.addby(h2);
s.addby(h3);
s.addby(h5);
s.addby(h4);
;
//打印出链表中的数据
s.print();
//修改操作
Hero h6 = new Hero(1,"李晖");
s.update(h6);
s.print();
//删除
s.delete(2);
s.print();
}
}
package Demo7;
public class Hero { // 积木
int no ;
String name;
Hero next; //积木的凹回去的地方
//构造方法
public Hero(){}
public Hero(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Hero{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
package Demo7;
import Demo6.HeroNode;
import java.util.Objects;
public class StringleLinked {
//初始化一个单项链表对象用于表示头结点
Hero head = new Hero(0,"");
//该怎么将他们变成一个连一个呢?
//他们都用next表示,咱们也用一下
// 先将他们一个个添加一下
public void add(Hero hero){
//先创建一个temp表示头结点,避免头结点指针随着添加发生改变
Hero temp = head; //头结点里面只有一个next,就没有数据
//添加 肯定是要到末尾进行添加,所以先循环遍历结点,找到最后一个结点
while(true){
//如果一开始一个数据都没有,光有一个头结点,那肯定是要在头结点后面添加数据咯!
if(temp.next==null){
temp.next = hero; // 找到末尾后,进行添加数据索引地址
break ;
}
//此时还在循环中,通过改变循环条件,继续循环
temp = temp.next;
}
}
//插入操作,根据编号的大小来进行添加;
public void addby(Hero hero){
//首先要找位置,才能进行添加,位置需要循环遍历才能得到,不能改变头指针
Hero temp = head;
boolean flag = false; //判断是否重复
while (true){
if(temp.next==null){ //在temp后面的位置进行添加
break;
}
if(temp.next.no>hero.no){
break;
}else if(temp.next.no== hero.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){ //if里面的flag 为true
System.out.println("重复存入编号为:"+hero.no+"请检查!");
}else{ //为flag
hero.next = temp.next;
temp.next = hero;
}
}
//根据编号进行修改
public void update(Hero hero){
//先判断链表为不为空
if (head.next==null){
System.out.println("此链表为空!");
return;
}
//设置一个temp,用来循环链表
//用flag来判断,是否能找到这个编号
Hero temp = head;
boolean flag = false;
while (true){
if(temp.next == null){
break;
}
if(temp.next.no == hero.no){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
//说明找到相同的编号好了,进行修改
temp.next.name = hero.name;
return;
}else{
System.out.println("根据编号并没有找到此编号!");
}
}
//删除节点
public void delete(int no){
//先判断链表是否为空
if (head.next==null){
System.out.println("此链表为空");
return;
}
//接下来是,遍历链表,查找数据
Hero temp = head;
boolean flag = false;
while(true){
if(temp.next == null){
break;
}
if(temp.next.no == no){
break;
}
temp = temp.next;
}
if(flag){
System.out.println("没找这个节点!");
}else{
temp.next = temp.next.next;
}
}
//将链表中的数据一个一个的显示出来
public void print(){
//先判断是否有数据
if(head.next==null){
System.out.println("空链表");
return;
}
//循环将一个个数据拿出来,当然还是不能改变头结点的next
Hero temp = head;
//while循环遍历,将数据取出来
while(true){
if(temp.next==null){
return;
}
System.out.println(temp.next);
temp = temp.next; //改变循环条件
}
}
}