/*
* @Description: 学生成绩 单向链表,包含:学号、姓名、成绩
* @Autor: SuHe
* @Date: 2023-04-13 15:24:44
*/
// 节点类
class Node {
int data;
int np; //成绩
String name;//姓名
Node next;
public Node(int data,String name,int np) {
this.data = data;
this.name = name;
this.np = np;
next = null;
}
}
// 链表类
public class StuLinkedList {
public Node first;
public Node last;
public boolean isEmpty(){
return first == null;//头节点为null时,链表为空
}
public void print() {
Node current = first;
while(current != null) {
System.out.println("[" + current.data + " " + current.name + " " + current.np);
current = current.next;//输完一个节点,指针后移一位
}
System.out.println();
}
public void insert(int data, String name,int np) {
Node newNode = new Node(data, name, np);
// 如果链表为空,插入的新节点即头节点
if(this.isEmpty()) {
first = newNode;
last = newNode;
}
// 链表不为空,将last的指针指向newNode
else {
last.next = newNode;
last = newNode; //指针后移
}
}
public void delete(Node delNode) {
Node curNode = first;
Node preNode = null;//delNode的前驱
while( curNode != null) {
if(curNode.next == delNode){
preNode = curNode;
break;
}
curNode = curNode.next;
}
//要删除的是头节点
// 把first 指为 first.next
if(delNode.data == first.data) {
first = first.next;
}
// 要删的是尾节点
// 找前驱pre.next指向null
else if(last.data == delNode.data) {
preNode.next = null;
}
// 要删的是中间节点
// 找delNode的前驱和后继
else {
Node nextNode = delNode.next;//delNode的后继
preNode.next = nextNode;
}
}
}