1、何为单链表?
以节点方式进行存储的有序列表。每个节点包含:data域(存储数据的值)、next域(指向下一节点)。在内存中,链表通过next域相互连接,所以链表中的各个节点不一定依次排列存储在内存中。
链表分为带头节点和不带头节点的链表,根据具体情况选择使用。
链表较数组而言更灵活,可以动态管理数据。
2、单链表添加数据
public class singlelianbiao {
public static void main(String[] args) {
//定义四个节点,进行测试
Jiedian jiedian1 = new Jiedian(1,"宋江","及时雨");
Jiedian jiedian2 = new Jiedian(2,"卢俊义","玉麒麟");
Jiedian jiedian3 = new Jiedian(3,"吴用","智多星");
Jiedian jiedian4 = new Jiedian(4,"林冲","豹子头");
//创建链表
singlelinkedlist sl = new singlelinkedlist();
//向链表中按照方式一添加节点
// sl.add1(jiedian1);
// sl.add1(jiedian2);
// sl.add1(jiedian3);
// sl.add1(jiedian4);
//向链表中按照方式二添加节点
sl.add2(jiedian1);
sl.add2(jiedian4);
sl.add2(jiedian3);
sl.add2(jiedian2);
System.out.println("链表为:");
sl.show();
// System.out.println("进行链表某节点的修改:");
// sl.update(newjiedian);
// System.out.println("修改后的链表为:");
// sl.show();
sl.delete(2);
sl.delete(2);
sl.delete(4);
System.out.println("删除节点后的链表为:");
sl.show();
}
}
//定义节点
class Jiedian {
public int number;//序号
public String name;//名称
public String anothername;//别名
public Jiedian next;//next指针,在此处为“等待赋值状态”,所有值都为null
//重写toString方法。
//注意:若toString方法中加上了next,就会一层一层的往下找完再输出全部的。所以在这里不需要添加next
@Override
public String toString() {
return "Jiedian{" +
"number=" + number +
", name='" + name + '\'' +
", anothername='" + anothername + '\'' +
'}';
}
//定义构造函数
public Jiedian(int number, String name, String anothername) {
this.number = number;
this.name = name;
this.anothername = anothername;
next = null;
}
}
//定义单链表,管理数据
class singlelinkedlist{
//定义头节点
private Jiedian head = new Jiedian(0,"","");
//第一种添加的方式:向单链表中依次添加结点,来一个就添加到链表尾部
public void add1(Jiedian jiedian){
Jiedian temp = head;//定义一个移动指针,先让他指向头节点
while(true){
if(temp.next == null){
temp.next = jiedian;
break;
}
temp = temp.next;
}
}
//第二种添加的方式:找到节点应在的位置,再将节点添加进去
public void add2(Jiedian jiedian){
Jiedian temp = head;//定义一个移动指针,先让他指向头节点
while(true){
if(jiedian.number == temp.number){
System.out.println("链表中已存在编号为" + jiedian.number + "的数据,请勿重复添加!");
break;
}
if(temp.next == null){
//链表为空,可以直接将数据添加进去
temp.next = jiedian;
break;
}
if(temp.next.number > jiedian.number){
//此时找到了此节点可以加入的位置
jiedian.next = temp.next;
temp.next = jiedian;
break;
}
temp = temp.next;//以上if条件都不满足
}
}
//修改节点
public void update(Jiedian jd){
Jiedian temp = head;
while(true){
if(temp.next == null){
System.out.println("链表中无此相关节点!");
break;
}
if(jd.number == temp.number){
temp.anothername = jd.anothername;
temp.name = jd.name;
System.out.println("修改成功!");
break;
}
temp = temp.next;
}
}
//删除节点
//若要传入一个节点,一定要牢记此节点并不在链表中,他的next是null而非链表中的下一个,所以不能写节点.next!!错大发咯
public void delete(int number){
Jiedian temp = head;
while(true){
if(temp.next == null){
System.out.println("链表中无此节点!");
break;
}
//此处一定要让temp指针移动到需要删除节点的前一个节点的位置,不然删除时无法找到此节点,就无法进行删除操作
if(temp.next.number == number){
temp.next = temp.next.next;
System.out.println("删除成功!");
break;
}
temp = temp.next;
}
}
//显示链表(遍历)
public void show(){
//先判断链表是否为空
if(head.next == null){
System.out.println("链表为空!");
return;
}
Jiedian temp = head.next;//定义一个移动指针
//使用temp != null保证了最后一个节点也可以被输出
while(temp != null){
System.out.println(temp);
temp = temp.next;
}
}
}
总结
1>return、break、continue的区别:
return:不是专门用于跳出循环的,而是去结束一个方法。一旦执行到一个return语句,则此方法将直接结束。
break:跳出当前循环,不再进行循环,即:完全终止循环。
continue:结束这一次的循环,转而去执行下一次循环,即:中止本次循环。