单链表链表特新分析
- 链表是一种有序的列表。他是以节点的形式来存储。所以在他的每一个节点里面,需要有一个next域来将其他的节点进行连接。
- 链表的存储在内存中并不是连续的。
- 链表分为有头节点的链表和没有头节点的链表。(这里我们讲有头节点的链表)。
单链表的代码分析
创建节点
这里我们使用一个学生类来作为我们的节点。
class Student {
private String name; // 学生的姓名
private int id; // 学生的学号
private Student next; // 节点的next域
public Student(String name, int id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", id=" + id + '}';
}
}
然后我们来写一个链表类,命名为LinkedList,并且在链表类中创建一个头节点,方便我们对链表进行操作。
class LinkedList {
private Student head = new Student("", 0);
}
接着我们就要在这个链表类中添加操作链表的方法了。
- 因为每次操作链表的时候,头节点是不可以移动的,所以我们在方法中定义一个辅助节点来对链表更方便的操作。
- 其中的while循环用来遍历节点,直到找到需要操作的节点
添加节点
直接在链表结尾添加节点
// 这个插入方法不会考虑每个节点中的编号的顺序。直接将新的节点插入到最后。
public void add(Student student) {
Student temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = student;
}
根据学生的序号进行添加
// 这个方法中会考虑到插入节点中的序号,根据序号的顺序来进行插入。
public void addByOrder(Student student) {
Student temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id > student.id) {
break;
} else if (temp.next.id == student.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("该学生信息已经录入!");
} else {
student.next = temp.next;
temp.next = student;
}
}
修改节点信息
public void change(Student student) {
if (head.next == null) {
System.out.println("该链表为空!");
return;
}
Student temp = head;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == student.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = student.name;
temp.id = student.id;
} else {
System.out.println("没有找到该节点!");
}
}
删除节点
public void del(int number) {
Student temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id == number) {
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;
}
Student temp = head;
while (true) {
if (temp.next == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
最后再来写一个主类来测试一下
public class LinkedListTest {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
Student student1 = new Student("张三", 1);
Student student2 = new Student("李四", 2);
Student student3 = new Student("王五", 3);
Student student4 = new Student("赵六", 4);
Student student5 = new Student("孙七", 5);
Student student6 = new Student("周八", 6);
linkedList.add(student1);
linkedList.add(student2);
linkedList.add(student3);
linkedList.show();
System.out.println("----------------------");
linkedList.del(0002);
linkedList.show();
System.out.println("----------------------");
linkedList.addByOrder(student6);
linkedList.addByOrder(student4);
linkedList.addByOrder(student5);
linkedList.show();
System.out.println("----------------------");
Student student = new Student("郑十",1);
linkedList.change(student);
linkedList.show();
System.out.println("----------------------");
}
}