单链表的结构
单链表的定义
一个结点有两个部分,分别是:(数据域,地址域),其中,数据域也就是数据本身,地址域(也称为引用域、指针域、链),也就是它的下一个要去的元素
每个结点只有一个地址域的线性链表称为单链表
单链表定义:
一个头结点,还有next作为指针,也就是结点的地址域,存放后继结点的引用信息。
首先是头结点,以及单链表的一些操作
public class SinglyLinkedList {
Student head = new Student(0, "0", 0); //创建头结点head,指针next在Student
public Student getHead() { //查询头结点
return head;
}
public void add(Student s) { //添加加元素
Student t = head; //设一个元素为头结点
while (true) {
if (t.next == null) { //判断头结点的下一个元素(也就是指针)是不是空的,空的就退出循环
break;
}
t = t.next; //下一个上面的判断,下一个元素不为空,就等于下一个元素然后又回到上面继续判断
}
t.next = s; //上面判断到下一个元素为空了之后,这里就把下一个元素等于s也就是测试类那边加入的元素
}
public void list() { //查询
if (head.next == null) { //判断头结点的下一个数为不为空,空的话就不用往下看了
System.out.println("空");
}
Student t = head.next; //设一个元素等于链表的指针
while (true) {
if (t == null) { //判断元素为不为空,为空结束
break;
}
System.out.println(t); //输出元素
t = t.next; //因为上面没结束,所以肯定还有下一个元素,这里就等于下一个元素继续输出
}
}
public void list(int i) { //指定查询
int j=0;
Student t =head.next; //等于头结点的下一个元素
if (t.next == null) {
System.out.println("空");
}
while (true) {
if (j==i) { //j来判断和输入的i相等了就输出
System.out.println(t);
break;
}
if (t.next==null){ //下一个元素为空了就退出
break;
}
t = t.next; //上面没结束就继续指向下一个元素
j++;
}
}
public void remove(int i) { //删除
int j = 0;
Student p = head;
while (p.next != null && j < i) { //判断头结点的下一个元素不等于空或者j<i打到条件就结束循环,寻找要删除的结点的位置
p = p.next;
j++;
}
if (p.next != null && j == i) { //找到后直接用结点的的指针指向下一个元素结点的指针,比如:1的一个元素是2,2的下一个元素是3
p.next = p.next.next; //要删除2就直接把1的下一个元素指向3,那么就123就变成了13
}
}
public void set(int i, Student t) { //修改
int j = 0;
if (head.next == null) {
System.out.println("链表为空");
}
Student p = head.next;
boolean flag = false; //设一个布尔来判断代码下面会用到
while (true) {
if (p.next == null) { //判断下一个值是不是为空,因为不设长度,不判断的话i比长度还多的话就会一直循环
break;
}
if (j == i) { //这里找到要修改的位置然后break退出循环
flag = true;
break;
}
p = p.next;
j++;
}
if (flag) {
p.no = t.no; //这里修改元素为新元素里面的参数
p.name = t.name;
p.score = t.score;
} else
System.out.println("当前节点不存在,无法修改!");
}
public Student paixu(Student head) { //排序,排序可以自己带入参数思考一下
if (head == null || head.next == null) {return head;}
Student n1=head;
Student n2=head.next;
Student n3=new Student(0,"",0);
n3.next=head;
while (n2!=null){
if(n2.score < n1.score){
n1.next=n2.next;
Student no1=n3;
Student no2=n3.next;
while (n2.score > no2.score){
no1=no2;
no2=no2.next;
}
no1.next=n2;
n2.next=no2;
n2=n1.next;
}else {
n1=n2;
n2=n2.next;
}
}
return n3.next;
}
}
然后是指针next可以去顺序表那里Student类复制代码
接着就是测试类了
public class ceshi1 {
public static void main(String[] args) {
Student x1=new Student(1,"大娃",10); //添加数据
Student x2=new Student(2,"二娃",40);
Student x3=new Student(3,"三娃",70);
Student x4=new Student(4,"四娃",91);
Student x5=new Student(5,"五娃",94);
Student x6=new Student(6,"六娃",97);
SinglyLinkedList list1=new SinglyLinkedList(); //创建单链表
list1.add(x1); //添加单链表元素
list1.add(x3);
list1.add(x5);
System.out.println("单链表1:");
list1.list(); //遍历单链表元素
SinglyLinkedList list2=new SinglyLinkedList();
list2.add(x2);
list2.add(x4);
list2.add(x6);
System.out.println("单链表2:");
list2.list();
System.out.println("合并两个链表:");
list2.add(list1.head.next); //合并
list2.list();
System.out.println("排序链表:");
list2.paixu(list2.head); //按成绩从小到达排序
list2.list();
list1.remove(4); //删
System.out.println("删除第五个后");
list1.list();
System.out.println("查询第3个元素"); //查
list1.list(2);
System.out.println("第三个元素修改为大娃"); //改
list1.set(2,x1);
list1.list();
}
}
测试结果