数据结构与算法 — 单链表

一、链式结构

线性表的链式存储结构成为链表,每个存储节点不仅包含元素本身的信息(数据域),而且还包含着元素之间的逻辑关系(指针域)。

二、单链表

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("没有找到要删除节点。。。");
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_43773562/article/details/107662753