链表基础知识

1.链表简介

链表是一种线性表数据结构。它使用一组任意的存储单元,可以连续可以不连续,来存储一组相同类型的数据。

以单链表为例:

可以看出,一个链表是由多个节点连接组成。每个节点不仅需要存放数据的值,还有要存放一个后续节点的地址 ,即后继指针。

优点:

        存储空间不用事先分配,在需要存储空间时,可以直接进行添加元素。在移动,插入,删除元素等操作的时间效率比数组高

缺点:

        链表占用的空间大,并且需要访问元素时的时间效率不如数组,因为数组可以随机访问,而链表只能遍历

2.链表的基本操作

链表的基本操作基本是:增,删,改,查

定义一个链表类:

首先,链节点的结构定义:

public class Node {
    int data;
    Node next;
    Node(int data){
        this.data=data;
    }
    Node (int data ,Node next){
        this.data=data;
        this.next=next;
    }

 链表的定义:

public class List {
    private int size;
    private Node head;

}

链表的增加:

有三种方式:头插法,尾插法,中间插入;

头插法,就是在链表第一个节点前插入节点

public void headInsert(int data){
        Node node=new Node(data);
        if (size != 0) {

            node.next = head;
            head=node;
            size++;
        }else {

            head=new Node(data);
            size++;
        }

    }

中间插入:

 public void insertByIndex(int index,int data){
        if(size==0){
            System.out.println("链表为空,无法插入");
        } else if (index<0||index>size) {
            System.out.println("索引不正确");
        } else if (index==0) {
            headInsert(data);
        }else{

            Node node=new Node(data);
            Node pre=head;
            for(int i=0;i<index-1;i++)
            {
                pre=pre.next;
            }
            node.next=pre.next;
            pre.next=node;
            size++;
        }
    }

 尾插法:就在全部元素后面添加

public void tailInsert(int data){
        insertByIndex(size,data);
    }

 链表中查找元素

在链表中查找某个元素的位置,只能从头节点开始,一个一个逐步从查找,找到则返回该节点的地址,否则返还null

public Node find(int data) {
        Node n = head;
        while (n != null) {
            if(n.data == data) {

                return n;
            }
            n = n.next;
        }
        return null;
    }

链表中删除元素

public void delete(int data){
        if(head.data==data){
            Node n=head;
            head=head.next;
            n.next=null;
            size--;
        }else{
            Node pre=head;
            while(pre.next!=null){
                if(pre.next.data==data){
                    Node n=pre.next;
                    pre.next=n.next;
                    n.next=null;
                    size--;
                    break;
                }else{
                    pre=pre.next;
                }
            }
        }

    }

链表中改变元素的值:

public void change(int index,int data){
        if (index>=0&&index<size) {
            Node n=head;
            for(int i=0;i<index;i++){
                n=n.next;
            }
            n.data=data;
        }else {
            System.out.println("索引错误");
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你要不要认识我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值