一、链式结构
线性表的链式存储结构成为链表,每个存储节点不仅包含元素本身的信息(数据域),而且还包含着元素之间的逻辑关系(指针域)。
二、单链表
1.定义
每一个结点只含有一个指针域的链式结构称为单链表,也就是只能单方向去得到别的节点的信息。
2.带头节点的单链表与不带头节点的单链
不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,所以处理起来应该是更复杂的。因此,通常在单链表的开始结点之前附设一个头结点。(这里主要讲带头结点的单链表)
三、单链表的实现与思路
1.定义结点
假设这个单链表的每一个结点存储的数据为一个学生信息,学生信息包括学号与姓名
class StudentNode{
public int id;
public String name;
public StudentNode next;
//重写构造函数
public StudentNode(int id,String name){
this.id = id;
this.name = name;
}
//重写tostring方法,方便遍历
@Override
public String toString() {
return "StudentNode{" +
"id=" + id +
", name='" + name +
'}';
}
}
2.创建单链表
创建SingleLinkedList并初始化头结点。这个头结点是指向最前面节点的,一旦改变了,整个链表也就找不到了。所以不能轻易的改变。
class SingleLinkedList{
private StudentNode head = new StudentNode(0,"");
}
3.添加节点(尾部)
只需要遍历整个链表,找到链表的最后一个节点,然后将它的next指向新添加的节点即可。
//添加
public void add(StudentNode studentNode){
//head不能改变,所以取一个辅助变量
StudentNode temp = head;
while (true){
if (temp.next == null){
break;
}
temp= temp.next;
}
temp.next = studentNode;
}
4.顺序添加节点(根据学号自动排序)
首先经过遍历,找到你需要添加节点位置的上一个节点。如下图在a3和a5中添加新节点,操作为先让新节点a4指向a5,然后让a3节点指向新节点,就可以实现出入操作。
//顺序添加
public void addById(StudentNode studentNode){
StudentNode temp = head;
boolean f = false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.id > studentNode.id){
break;
}else if(temp.next.id == studentNode.id){
f=true;
break;
}
temp= temp.next;
}
if (f==false){
studentNode.next = temp.next;
temp.next = studentNode;
}else {
System.out.println("已经存在该节点。。。");
}
}
5.显示列表
进行遍历,然后打印出来。
//显示列表
public void list(){
if (head.next==null){
System.out.println("空的");
return;
}
StudentNode temp = head.next;
while (true){
if(temp == null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
6.修改节点(根据id来修改学生节点)
找到对应的节点,然后把学生的属性重新赋值就行。
//根据id来修改学生节点
public void upData(StudentNode studentNode){
StudentNode temp = head.next;
if (head.next == null){
System.out.println("该链表为空...");
return;
}
boolean f = false;
while (true){
if (temp == null){
break;
}
if (temp.id == studentNode.id){
f=true;
break;
}
temp=temp.next;
}
if (f==true){
temp.name = studentNode.name;
}else {
System.out.println("没有找到该节点");
}
}
7.删除节点
首先应该找到想要删除节点的上一个节点,如图,要将a4节点删除。只要改变a3的指针域,将a3指向a5,那么在链表中节点a4就不存在了。一般情况下,删除一个节点后还需要释放内存空间,a4节点就会被释放,实现删除。
//删除节点
public void delete(int id){
StudentNode temp = head;
boolean f = false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.id == id){
f=true;
break;
}
temp = temp.next;
}
if (f==true){
temp.next = temp.next.next;
}else {
System.out.println("没有找到要删除节点。。。");
}
}