线性表的链式存储结构——链表
线性表的链式存储结构称为线性链表,简称链表。常见的链表有单链表、循环链表和双向链表。链表的优点是数据的插入或删除都非常方便,不需要移动大量数据;缺点是设计数据结构时稍显麻烦,并且在查找数据时,无法像顺序表那样可随机读取,必须按顺序找到该数据为止。
链表是用一组任意的存储单元(可以是连续的,也可以是不连续的存储单元)来存储线性表中的数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻,因此,必须采用附加信息表示数据元素之间的逻辑关系。存储一个数据元素的存储单元称为结点(Node),一个结点至少包含两个部分:
结点(数据域,地址域)
其中,数据域存储数据元素本身,地址域(也称为引用域、指针域、链)存储前驱或后继结点的地址。地址域确定了数据元素之间的逻辑关系。
2.3.1单链表的结构
1.单链表的定义
每个结点只有一个地址域的线性链表称为单链表(Singly Linked List),结点结构如下:
单链表结点(数据域data,后继结点地址域next)
单链表有带头结点和不带头结点两种。图2-4所示为带头结点的单链表,指向单链表的指针 head称为头指针,头指针所指向的不存放数据元素的第一个结点称为头结点,存放第一个数据元素a。的结点称为开始结点,存放最后一个数据元素a_的结点称为尾结点。
1. 1单链表结点类
public class Students {
String name;
int id;
int score;
public Students next;
public Students(String name, int id, int score) {
this.name = name;
this.id = id;
this.score = score;
}
public String getName() {
return name;
}
public int getNumber() {
return id;
}
public int getScore() {
return score;
}
public Students getNext() {
return next;
}
public void setName(String name) {
this.name = name;
}
public void setNumber(int number) {
this.id = number;
}
public void setScore(int score) {
this.score = score;
}
public void setNext(Students next) {
this.next = next;
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", number=" + id +
", score=" + score ;
}
}
1.2方法实现
public class StudentsList {
Students head = new Students("", 0, 0);
public Students getHead() {
return head;
}
//添加,在链表的尾部添加元素
public void add(Students s) {
Students temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
//Students newnode = new Students(s.name,s.id,s.score);
temp.next = s;
}
//遍历
public void list() {
if (head.next == null) {
System.out.println("链表为空");
}
Students temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
System.out.println(temp);
}
}
//删除
public void remove(int i) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Students temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id == i) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("元素不存在");
}
}
}
1.3实现代码
public class Demo {
public static void main(String[] args) {
Students s1 = new Students("meiko",1,80);
Students s2 = new Students("marry",2,90);
Students s3 = new Students("jack",3,92);
Students s4 = new Students("aa",4,80);
Students s5 = new Students("bb",5,99);
Students s6 = new Students("cc",6,100);
//表1
StudentsList list1 = new StudentsList();
list1.add(s1);
list1.add(s2);
list1.add(s3);
System.out.println("表1:");
list1.list();
//表2
StudentsList list2 = new StudentsList();
list2.add(s4);
list2.add(s5);
list2.add(s6);
System.out.println("表2:");
list2.list();
//删除
System.out.println("删除表1学号为2的学生");
list1.remove(2);
list1.list();
//合并
System.out.println("合并");
StudentsList list3 = new StudentsList();
list3.merge(list1,list2,list3);
list3.list();
}
4.一些方法其它算法
(1)求表长、清空、判断表空
public int size(){
int n = 0;
Students temp = head.next;
While(temp!null){
temp++;
temp=temp.next;
}
return n;
}
(2) 清空单链表
public void clear(){
head.next = null;
//清空单链表
}
太多了太多了 不一一总结了 总结主要的就好了
————————————————
版权声明:本文为CSDN博主「xiexieya233」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiexieya233/article/details/124111684