链表总结

1.链表是什么?
链表是一种物理存储单元上非连续,非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链按次序实现的。

2.链表由什么组成?
链表是有一系列的节点(链表中的每一个元素成为节点)组成。节点在运行时动态生成。
节点有两部分构成:(1)存储数据元素的数据域 (2)存储下一个节点地址的指针域。

3.链表和线性表顺序结构相比有哪一些优点?
链表比较容易实现元素的插入和删除操作。

4.链表种类
(1)单向链表
(2)双向链表
(3)循环链表

5.链表的实现
下面以单向链表为例介绍链表的实现。

既然链表是有节点组成,所以我们就必须先实现节点。下面创建一个节点类
/**
*
* 节点类
*
*/
public class Node {
private Node next;//声明节点下一个节点属性(节点指针域)
private Student data;//声明节点数据属性(节点数据域)(设置类型为Student,后面做链表的增删改查用到Student对象) public Node(Node next) {
/**
* 构造方法
* @param data节点数据
*/
public Node(Student data){
this.data=data;
}
/**
* 获取下一个节点的方法
* @return返回下一个节点
*/
public Node getNext() {
return next;
}
/**
* 设置下一个节点的方法
* @param next新的下一个节点对象
*/
public void setNext(Node next) {
this.next = next;
}
/**
* 获取节点数据的方法
* @return返回节点数据
*/
public Student getData() {
return data;
}
/**
* 设置节点数据的方法
* @param data新的数据对象
*/
public void setData(Student data) {
this.data = data;
}
}


这样就有了节点了,下面我们利用这个节点类来实现利用链表实现学生数据的增删改查。


下面利用该节点类创建一个链表类,该链表的功能包括添加、删除、修改学生的信息
/**
* 链表类
*
*
*/
public class Linked {
private Node root=null;//声明根节点对象
private int size=0;//声明链表长度
/**
* 往链表头添加节点的方法
* @param node要加入的节点
*/
public void add_head(Node node){
//如果根节点为空
if(root==null){
//设置跟节点为node
root=node;
}else{//如果根节点不为空,设置node的下一个节点为root
node.setNext(root);
//设置根节点为node
root=node;
}
//链表长度加1
size++;
}
/**
* 删除指定位置节点的方法
* @param index指定位置的索引
*/
public void remove(int index){
//如果要删除的节点是根节点
if(index==1){
root=root.getNext();
}else{
Node temp=root;
//找出要删除位置的上一个节点
for(int i=1;i<index-1;i++){
temp=temp.getNext();
}
//将要删除的节点的上一个节点的下一个节点设置为删除节点的后一个节点
temp.setNext(temp.getNext().getNext());
}
//链表长度减少1
size--;
}
/**
* 修改指定位置学生成绩的方法
* @param score学生的新成绩
* @param index学生的位置值
*/
public void setData(int score,int index){
Node temp=root;
//找出该位置存储学生信息的节点
for(int i=1;i<index;i++){
temp=temp.getNext();
}
//实例化一个新的学生对象
Student stu=new Student(temp.getData().getName(),score);
//修改该位置学生的成绩
temp.setData(stu);
}
/**
* 输出链表中存储的学生信息
*/
public void print(){
Node temp=root;
System.out.println(root.getData().toString());
for(int i=1;i<size;i++){
temp=temp.getNext();
System.out.println(temp.getData().toString());
}
}
}



下面我们来检测下结果
/**
* 链表测试类
*
*
*/
public class LinkedTest {
/**
* 主函数
*/
public static void main(String[] args) {
//实例化三个学生对象
Student stu1=new Student("学生1",10);
Student stu2=new Student("学生2",20);
Student stu3=new Student("学生3",30);
//实例化三个节点对象,节点的数据为以上三个学生对象
Node node1=new Node(stu1);
Node node2=new Node(stu2);
Node node3=new Node(stu3);
//实例化一个链表
Linked link=new Linked();
//往链表中添加节点
link.add_head(node1);
link.add_head(node2);
link.add_head(node3);
//输出学生信息
link.print();
//删除第1个学生的信息
link.remove(1);
System.out.println("********************************");
//在输出学生信息
link.print();
//修改第二个学生的成绩
link.setData(100, 2);
//在输出学生的信息
System.out.println("+++++++++++++++++++++++++++++++++");
link.print();
}
}


我们可以看到以下输出结果:

姓名:学生3 学分:30
姓名:学生2 学分:20
姓名:学生1 学分:10
********************************
姓名:学生2 学分:20
姓名:学生1 学分:10
+++++++++++++++++++++++++++++++++
姓名:学生2 学分:20
姓名:学生1 学分:100

可以看出来结果是我们所要的、


循环链表和单向链表基本是一样的,唯一不同的是循环链表的最后一个节点的下一个节点是根节点。这样就围成了一个圈。

而双向链表只需在单向链表的节点类中多加一个上一个节点的属性就行了,一个节点能既能指向下一个节点,也

能指向上一个节点。其他的基本一样。而他们在使用时看情况而定了,不同的链表适合于不同的实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值