数据结构--链表

一.什么是链表?

  链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删

除数据十分方便,但寻找与读取数据的表现欠佳。

二.链表的结构

链表的核心是节点。一般节点包括数值部分和指针部分。

下面是节点定义:

这里以 LeetCode 中的题目为例:

public class ListNode {

    public int val;//数值部分

    public ListNode next;

    public ListNode() {

    }
    public ListNode(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

   链表之间是通过指针相连,所以不需要像数组那样需要申请连续的一段空间,但是链表是没有索引的,所以查询连表中的某个节点就必须从头开始遍历链表找,所以查询速度没有数组快,但是对于中间节点的插入和删除,只需要断开连接部分,重新连接即可实现链表新节点的添加和删除,所以增删快。

三.链表增加数据

1.头插法

在链表头部插入数据。

    //头插法
    public void addFirst(int val) {
        ListNode newNode=new ListNode(val);
        if(head!=null){
            newNode.next=head;
        }
        head=newNode;
        size++;//链表长度
    }

2.尾插法

在链表尾部插入数据

    public void addLast(int val) {
        ListNode newNode=new ListNode(val);
        //如果头指针为空,那么新节点就是头节点
        if(Objects.isNull(head)){
            head=newNode;
        }else{
            ListNode curr=head;
            while (curr.next!=null){
                curr=curr.next;
            }
            curr.next=newNode;
        }
        size++;
    }

3.在中间位置添加元素

    public void add(int index, int val) {
        //在第一个位置添加节点,可以直接调用addFirst()
        if(index==0){
            addFirst(val);
        }
        if(index<0 || index>=size){
            throw new MyLinkException("索引越界");
        }
        ListNode curr=head;
        ListNode newNode=new ListNode(val);
        //这里因为是要拿到插入位置的前一个节点,又因为语句中是 curr=curr.next; 所以这里循环只需要到 index-1
        for (int i = 0; i < index - 1; i++) {
            curr=curr.next;
        }
        newNode.next=curr.next;
        curr.next=newNode;
        size++;
    }

四.链表删除数据

1.删除头节点

    public void removeFirst() {
        head=head.next;
        size--;
    }

2.根据索引位置删除

    public void remove(int index) {
        ListNode first=head;
        ListNode target;
        ListNode second;
        for (int i = 0; i < index - 1; i++) {
            first=first.next;
        }
        target=first.next;
        second=target.next;
        first.next=second;
        target.next=null;
        size--;
    }

3.根据值删除

Node pre = head;
 if (data == head.data) {
    removeFirst();
    return true;
    }
if (pre == null) throw new LinkedException("空链表删除失败");
 while (pre.next != null) {
     if (pre.next.data == data) {
     Node target = pre.next;
     Node next = target.next;
     pre.next = next;
     target.next = null;
    return true;
    }
 pre = pre.next;
  }
return false;

五.链表查找元素

1.根据索引查找

    public int get(int index) {
        ListNode curr=head;
        for (int i = 0; i < index; i++) {
            curr=curr.next;
        }
        return curr.val;
    }

2.根据数据查找

    public int indexof(int val) {
        ListNode curr=head;
        if(curr.val==val){
            return 0;
        }
        int index=0;
        for (int i = 0; i < size; i++) {
            if(curr.val==val){
                return index;
            }
            index++;
            curr=curr.next;
        }
        return index;
    }

六.链表修改节点

    public void set(int index, int val) {
        if(index<0 || index>size){
            new MyLinkException("索引异常");
        }
        ListNode curr=head;
        for (int i = 0; i < index; i++) {
            curr=curr.next;
        }
        curr.val=val;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值