Java数据结构之链表的增删查改详解

一. 概念与结构

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

Java数据结构之链表的增删查改详解_第1张图片

虽然有这么多的链表的结构,但是我们重点掌握两种:

1.无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

2.无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。

二.单链表接口实现

接下来新一带大家写无头单向非循环链表

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description: 链表
 * User: mac
 * Date: 2022-08-31
 * Time: 10:09
 */

//ListNode代表一个节点 - 存放在一个节点类中
class ListNode {
    public int val;
    public ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}
public class MyLinkedList {
    public ListNode head;//链表的头引用

    //打印链表
    public void display() {
        //this.head.next != null 会丢失一个数据
        ListNode cur = this.head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

    //查找是否包含关键字k
    public boolean contains(int key) {
        ListNode cur = this.head;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

    //得到单链表的长度
    public int size() {
        int count = 0;
        ListNode cur = this.head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }

    //头插法
    public void addFirst(int data){
        //绑定位置的时候一定要先绑定后边
        ListNode node = new ListNode(data);
        node.next = this.head;
        this.head = node;
    }

    //尾插法
    public void addLast(int data){
        ListNode node = new ListNode(data);
        if (this.head == null){//判空,否则就会造成引用异常this.head.next
            this.head = node;
        } else {
            ListNode cur = this.head;
            while (cur.next != null){
                cur = cur.next;
            }
            //cur.next = null;
            cur.next = node;
        }
    }

    public ListNode findindex(int index){//通过下表来移动指针
        ListNode cur = this.head;
        while (index - 1 != 0){
            cur = cur.next;
            index--;
        }
        return cur;
    }

    //任意位置插入,第一个数据节点为0号下标
    public void addIndex(int index, int data){
        if (index < 0 || index > size()){
            System.out.println("index位置不合法!");
            return;
        }
        if (index == 0){
            addFirst(data);
            return;
        }
        if (index == size()){
            addLast(data);
            return;
        }
        ListNode cur = findindex(index);
        ListNode node = new ListNode(data);
        node.next = cur.next;
        cur.next = node;
    }

    //删除第一次出现的关键字为key的节点
    public void remove(int key){
        if (this.head == null){
            System.out.println("单链表为空,不能删除!");
            return;
        }
        if (this.head.val == key){//判断头部是否为目标节点
            this.head = this.head.next;
            return;
        }
        ListNode cur = this.head;
        while (cur.next != null){
            if (cur.next.val == key){
                cur.next = cur.next.next;
                return;
            }
            cur = cur.next;
        }
        System.out.println("未找到该节点");
    }

    //删除所有值为key的节点
    public ListNode removeAllKey(int key){
        if (this.head == null) return null;

        ListNode prev = this.head;
        ListNode cur = this.head.next;

        while (cur != null){
            if (cur.val == key){
                prev.next = cur.next;
                cur = cur.next;
            } else{
                prev = cur;
                cur = cur.next;
            }
        }
        //最后处理头
        if (this.head.val == key){
            this.head = this.head.next;
        }
        return this.head;
    }

    //清空链表
    public void clear(){
        //this.head = null;//暴力解决 - 不推荐但没毛病
        while (this.head != null){
            ListNode curNext = this.head.next;
            this.head.next = null;
            this.head = curNext;
        }
    }

}

到此这篇关于Java数据结构之链表的增删查改详解的文章就介绍到这了,更多相关Java链表增删查改内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(Java数据结构之链表的增删查改详解)