Java常见数据结构整理(数组,栈,队列,链表,红黑树)二

本文深入探讨了Java中的链表数据结构,包括单链表和双链表的操作,如插入、删除等,以及链表的常见面试问题。此外,文章还详细介绍了二叉树的基础,特别是二叉搜索树和红黑树的概念,以及它们在数据存储和查找中的应用。
摘要由CSDN通过智能技术生成

目录

 

1.链表

1.1单链表

1.2双链表

1.3单链表常见操作

1.3.1InsertAtEnd - 在链表的末尾插入指定元素

1.3.2InsertAtHead - 在链接列表的开头/头部插入指定元素

1.3.3Delete - 从链接列表中删除指定元素(指定位置)

1.3.4Delete - 从链接列表中删除指定元素Node

1.3.5链表基础操作获取链表长度,是否链表为空等

1.4常见链表面试

1.4.1反转链表

1.4.2检测链表中的循环

1.4.3返回链表倒数第N个节点

1.4.4删除链表中的重复项

2.树

2.1二叉树基本概念

2.2常见二叉树

2.2.1平衡二叉树Balanced Binary Tree

2.2.2二叉搜索树Binary Search Tree

2.2.3红黑树Red Black Tree

2.3二叉排序树(二叉查找树、二叉搜索树)

2.3.1二叉排序树定义

2.3.2添加节点

2.3.3二叉树遍历

2.3.4二叉树查找

2.3.5二叉树删除

2.4红黑树Red Black Tree


1.链表

链表是另一个重要的线性数据结构,乍一看可能有点像数组,但在内存分配、内部结构以及数据插入和删除的基本操作方面均有所不同。

链表就像一个节点链,其中每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向null或无具体内容。

1.1单链表

单链表包含内容和下一个元素的指针;

单链表结构图:

在这里插入图片描述

单链表类定义:

class Node{
        int val;    //节点元素(内容)
        Node next;  //指向下一节点的引用
        public Node(int val){
            this.val = val;
        }
    }

1.2双链表

双链表包含内容,上一个元素指针和下一个元素的指针;包含单链表内容和下一个指针,多了上一个元素指针;

双链表结构图:

在这里插入图片描述

双链表类定义:

class Node{
        int val;    //节点元素(内容)
        Node pre;   //指向上一个节点引用
        Node next;  //指向下一节点的引用
        public Node(int val){
            this.val = val;
        }
    }

1.3单链表常见操作

//链表
public class LinkNode {

    Node head; //头
//    Node last;

    /**
     * 节点,包含节点元素(内容)和指向下一节点的引用
     */
    static class Node{
        int val;    //节点元素(内容)
        Node next;  //指向下一节点的引用
        public Node(int val){
            this.val = val;
        }
    }
}

1.3.1InsertAtEnd - 在链表的末尾插入指定元素

//在链表的末尾插入指定元素
    public void addNode(int d){
        Node node = new Node(d);
        if(head == null){
            head = node;
            return;
        }
        Node tmp = head;
        while (tmp.next != null){
            tmp = tmp.next;
        }
        tmp.next = node;
    }

1.3.2InsertAtHead - 在链接列表的开头/头部插入指定元素

//在链接列表的开头/头部插入指定元素
    public void addHeadNode(int d){
        Node node = new Node(d);
        if(head == null){
            head = node;
            return;
        }

        node.next = head;
        head = node;
    }

1.3.3Delete - 从链接列表中删除指定元素(指定位置)

 /**
     * 从链表删除第index(0-based)个位置的元素 ,返回删除结果  (实际不常用,练习用)
     * @param index
     * @return
     */
    public boolean deleteIndexNode(int index){
        if(index<0 || index>=length()){
            return false;
        }

        if(index == 0){
            head = head.next;
        }else {
            Node pre = head;
            for(int i=1; i<index; i++){
                pre = pre.next; //获取删除节点的前一个节点
            }
            Node temp = pre.next;   //保留要删除节点
            pre.next = temp.next;   //删除节点的next赋值给删除节点的前一个节点next
            temp.next = null;       //删除节点next设置为null
        }

        return true;
    }

1.3.4Delete - 从链接列表中删除指定元素Node

  /**
     * 删除指定节点
     * @param node
     * @return
     */
    public boolean deleteNode(Node node){
        if(node == null || head == null){
            return false;
        }
        //不是最后一个节点
        if(node.next != null){
            Node q = node.next;
            node.val = q.val;
            node.next = q.next;
            return true;
        }else {
            //最后节点
            Node temp =  head;
            while (temp.next != null){
                if(temp.next == node){
                    temp.next = node.next;
                    return true;
                }
                temp = temp.next;
            }
        }
        return false;
    }

1.3.5链表基础操作获取链表长度,是否链表为空等

//链表长度
    public int length(){
        if(head == null){
            return 0;
        }
        int length = 1;
        Node tmp =  head;
        while (tmp.next != null){
            length++;
            tmp = tmp.next;
        }
        return length;
    }

    public Node getHead(){
        return head;
    }

    /**
     * 判断链表是否为空
     * @return
     */
    public boolean isEmpty(){
        return head == null;
    }

    /**
     * 打印节点
     */
    public void printListNode(){
        Node temp = head;
        while (temp != null){
            System.out.println(temp.val);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值