数据结构线性表之单链表

数据结构(java版)

线性表

单链表

单链表是线性表的链式表示,链表里每一个元素称为一个结点。一个结点里包含指针域和指针(或链),指针域是是存储位置,指针和链里面负责存储信息,这种结点的结合被称为链表。

在这里插入图片描述

java实现

先创建结点的类,Node负责指针域,data是储存的信息

package lianbiao;

public class Node {
    
    
    Node next=null;//node作为指针域初始化置空
    int data;//指针域中储存的信息

    public Node(int data) {
    
    //实现方法
        this.data=data;
    }
}

接下来是方法和实现

package lianbiao;

public class LianBiao {
    
    
    Node head = null;

    public void addHead(int data) {
    
    //添加头结点,链表中第一个空间
        Node node = new Node(data);
        node.next = head;
        head = node;
    }

    //打印
    public void printLink() {
    
    //打印这个链表
        Node curNode = head;//头结点设为curNode
        while (curNode != null) {
    
    //如果头结点不为空,则继续循环
            System.out.print(curNode.data + " ");
            curNode = curNode.next;//把curNode的下个结点设为头结点,循环遍历
        }
        System.out.println();//循环一次遍历一次,最后全部打印
    }

    //长度
    public int length() {
    
    
        int length = 0;//链表长度初始置0
        Node tmp = head;//头结点指向tmp
        while (tmp != null) {
    
    //查看tmp是否为空并遍历,
            length++;//如果不为空,记录的长度+1
            tmp = tmp.next;//检查完一个头结点指向下一个循环遍历直至结束
        }
        return length;
    }

    //在尾部插入
    public void addLast(int data) {
    
    
        Node node = new Node(data);//创建一个带有节点的数据
        Node temp = head;//头结点指向temp

        while (temp.next != null) {
    
    //遍历链表直至最后一位
            temp = temp.next;
        }
        temp.next = node;//在遍历到最后一位的后面加上刚刚创建的节点
    }

    //按索引插入
    public void insertByindex(int index, int data) {
    
    //输入想要插入的索引和数据
        Node node = new Node(data);
        if (index < 0 || index > length()) {
    
    //检查位置,不能小于0或大于链表长度
            System.out.println("位置错误");
            return;
        }
        int length = 1;//如果要插入,链表不可为空,长度应从1开始
        Node tmp = head;
        while (tmp.next != null) {
    
    //若不为0,循环遍历
            length++;//从1开始增加,记录长度
            tmp = tmp.next;
            if (index == length) {
    
    //当长度与想要插入的索引位置相同时
                node.next = tmp.next;//原位置数据后移
                tmp.next = node;//将想要插入的数据插入
                return;
            }
        }
    }

    //按索引删除
    public void deleteByIndex(int index) {
    
    
        Node temp = head;
        if (index < 0 || index > length()) {
    
    //检查位置,不能小于0或大于链表长度
            System.out.println("位置错误");
            return;
        } else if (index == 0) {
    
    //如果删除第一个位置,头指针指向下一个
            head = head.next;
        } else {
    
    
            for (int i = 1; i < index; i++) {
    
    //如果删除非第一个位置
                temp = temp.next;//将想删除位置的下一个数据指向这个位置
            }
            temp.next = temp.next.next;//把下一个位置的下一个如法炮制
        }

    }

    public static void main(String[] args) {
    
    
        LianBiao list = new LianBiao();
        list.addHead(22);
        list.addHead(33);
        list.addLast(1);
        list.addLast(3);
        list.addLast(4);
        list.printLink();
        list.insertByindex(2,111);
        list.printLink();
        list.addLast(999);
        list.printLink();
    }

}

输出:

33 22 1 3 4 
33 22 111 1 3 4 
33 22 111 1 3 4 999 

进程已结束,退出代码 0

基本功能和顺序表一样,主要是逻辑上的区别,顺序表插入删除需要移动整个数组空间,但是链表仅需要改变指针域,具体解释可以看数据结构严蔚敏版29页。

在这里插入图片描述
参考

猜你喜欢

转载自blog.csdn.net/qq_43652113/article/details/106715254
今日推荐