数据结构学习笔记(一):链表(linked list)

1 链表的概念和分类

链表,又称线性表或线性链表,是若干数据元素组成的线性序列,将数据元素像链条一样组织在一起。存储在链表中的数据元素被称为结点(node),每个结点具有两个要素:第一、数据元素的具体值,第二、指向下一个结点的指针,指针用来存储下一个结点的内存地址。根据结点的结构,链表可分为单向链表、双向链表、循环链表。

最基本的链表结构是单向链表,最前面是一个头指针用来指向第一个结点,最后一个结点的指针是一个空指针(null pointer),每一个结点都只指向它的下一个结点,例如一个存储了5个学生考试分数的链表:

双向链表(duoble linked list)每一个结点有两个指针,一个指向前驱结点(prev pointer),一个指向后续结点(next pointer),第一个结点的prev指针和最后一个结点的next指针都是空指针

让链表的最后一个元素指向第一个元素就构成了循环链表,循环链表也有单向双向两个类型。

2 链表对于数据的增删查操作(以单向链表为例)

2.1 增删查操作的描述

查找元素的功能,速度:只能通过遍历方式找到指定元素,即从链头(或链尾)开始一个个跳转,直到跳转到指定元素的位置。

增删元素的功能,速度:无论在哪个位置增加或删除元素,只需改变指针指向就能实现,即修改连接的下个元素的内存地址。

  • 插入元素的操作:让待插入结点的指针指向指定位置原来的结点,让指定位置前驱结点的指针指向待插入的结点。
  • 删除元素的操作:只需修改待删除结点前驱元素的指针,让前驱结点指针指向待删除结点的后续结点。

数据结构学习笔记(一):链表(linked list)_第1张图片

数据结构学习笔记(一):链表(linked list)_第2张图片

 

2.2 增删查操作的代码实现(JAVA)

用 Java 模拟以上图示中的链表操作。

MyLink.java:准备工作,创建一个链表类

package com.notes.data_structure;

public class MyLink {

    private Node headNode; // 定义一个头结点
    private Node currentNode; // 定义一个当前结点

    // 定义一个结点类
    private class Node {
        // 结点的两个要素:数据和指针
        private int data;
        private Node next;

        // 构造方法:Node实例化时给data赋值
        public Node(int data) {
            this.data = data;
        }

        public Node() {

        }
    }

    // 创建头结点
    private Node addHeadNode() {
        // 头结点用来模拟头指针,数据设为0
        headNode = new Node(0);
        return headNode;
    }

    // 增加结点
    public void addNode(int data) {
        // 如果头结点不存在,当前结点为头结点,这样就有了头指针
        if (headNode==null) {
            // 当前结点是头结点,调用头创建头结点的方法
            currentNode = addHeadNode();
        }
        // 创建一个新的结点
        Node node = new Node(data);
        // 当前结点的指针指向新结点
        currentNode.next = node;
        // 当前结点后移一位,新结点成为当前结点,正式加入链表
        currentNode = currentNode.next;
    }

    // 遍历打印所有的结点(不包括头结点)
    public void printLink() {
        // temp可以看作一个移动的指针
        Node temp = headNode;
        // 通过指针的移动遍历数组,直到指针指向链尾的null
        while(temp.next != null) {
            temp = temp.next;
            System.out.println(temp.data);
        }
    }

    /**
     * 模拟 “查” 有关的链表操作
     * 查找指定数据,返回数据所在的位置(索引)
     */
    public void searchNode(int data) {
        int index = 0; // 用于计算数据位置
        boolean notFound = true; // 用于存储是否找到数据
        // 遍历查找指定的数据
        Node temp = headNode;
        while(temp.next != null) {
            temp = temp.next;
            index ++;
            if (temp.data == data) {
                System.out.println(data+"存储在链表的第"+index+"个结点中");
                notFound = false;
                break;
            }
        }
        if(notFound) {
            System.out.println("没有找到值为"+data+"的元素");
        }
    }

    /**
     * 模拟与 “增” 有关的操作
     * 从尾部添加元素可直接通过 addNode() 方法实现
     * 由于设置了头结点(索引为0),从头部插入和从中间插入的操作是一样的
     * 插入的位置用 索引 描述,新结点进入该位置,其后的结点自动后移一位
     */
    public void insertNode(int index, int data) {
        // 实例化待插入的新结点,传入数据
        Node insertNode = new Node(90);
        // 用 for 定位到待插入位置的前一个结点
        Node prev = headNode;
        for(int i=0;i

linkdemo1.java:模拟查找与插入元素的操作

package com.notes.data_structure;

public class linkDemo01 {
    public static void main(String[] args) {
        /**
         * 准备工作,实例化 MyLink类,并添加结点
         */
        MyLink mylink = new MyLink();
        mylink.addNode(95);
        mylink.addNode(85);
        mylink.addNode(88);
        mylink.addNode(93);
        mylink.addNode(99);

        /**
         * 模拟链表 “查” 的操作,打印指定数据所在链表位置(索引)
         */
        mylink.searchNode(88);
        mylink.searchNode(100);

        /**
         * 模拟链表 “增” 的操作,让插入新结点到指定的链表位置(索引)
         */
        mylink.insertNode(3,90);
        // 打印所有元素,验证插入操作的结果
        mylink.printLink();
    }
}

linkdemo2.java:模拟删除操作

package com.notes.data_structure;

public class linkDemo02 {
    public static void main(String[] args) {
        MyLink mylink = new MyLink();
        mylink.addNode(95);
        mylink.addNode(85);
        mylink.addNode(88);
        mylink.addNode(93);
        mylink.addNode(99);

        /**
         * 模拟链表 “删” 的操作,删除指定索引位置的元素
         */
        mylink.deleteNode(3);
        // 遍历打印验证删除结果
        mylink.printLink();
    }
}

 

你可能感兴趣的:(数据结构学习笔记,数据结构,java,链表)