【剧前爆米花--爪哇岛寻宝】Java实现无头单向非循环链表和无头双向链表与相关题目

news2024/11/16 7:45:42

作者:困了电视剧

专栏:《数据结构--Java》

文章分布:这是关于数据结构链表的文章,包含了自己的无头单向非循环链表和无头双向链表实现简单实现,和相关题目,想对你有所帮助。

 

 

目录

无头单向非循环链表实现

无头双向链表实现

链表的相关题目

移除链表元素

反转一个单链表

链表的中间结点

链表中倒数第k个结点


无头单向非循环链表实现

public class SingleLinkedList {
    static class Node {
        public int val;//存储的数据
        public Node next;//存储下一个节点的地址
        //public Node(){}
        public Node (int val) {
            this.val = val;
        }
    }
    public Node head;
    public int size=0;
    //头插法
    public void addFirst(int data){
        Node node = new Node(data);
        node.next=head;
        head = node;
        size++;
    }
    //尾插法
    public void addLast(int data){
        Node node = new Node(data);
        if ( head==null ){
            head=node;
            return;
        }
        Node tmp=head;
        while ( tmp.next!=null ){
            tmp=tmp.next;
        }
        tmp.next=node;
        size++;
    }
    //任意位置插入,第一个数据节点为0号下标
    public boolean addIndex(int index,int data){
        //先判断idx是否合法
        if ( index>size||index<0 ){
            return false;
        }
        if ( head==null ){
            return false;
        }
        Node node = new Node(data);
        Node cur=head;
        int cnt=0;
        while ( cnt!=index ){
            cur=cur.next;
            cnt ++;
        }
        node.next=cur.next;
        cur.next=node;
        return true;
    }
    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
        if ( head==null ){
            return false;
        }
        Node cur = head;
        while ( cur!=null ){
            if ( cur.val==key ){
                return true;
            }
            cur=cur.next;
        }
        return false;
    }
    //删除第一次出现关键字为key的节点
    public void remove(int key){
        if ( head==null ){
            return;
        }
        if ( head.val==key ){
            head=head.next;
            return;
        }
        Node cur = head;

        while ( cur.next!=null ){
            if ( cur.next.val==key ){
                cur.next=cur.next.next;
                return;
            }
            cur=cur.next;
        }
    }
    //删除所有值为key的节点
    public void removeAllKey(int key){
        if ( head==null ){
            return;
        }
        Node pre=head;
        Node cur=head.next;
        while ( cur!=null ){
            if ( cur.val==key ){
                cur=cur.next;
                pre.next=cur;
            }else{
                pre=cur;
                cur=cur.next;
            }
        }
        if ( head.val==key ){
            head=head.next;
        }
        return;
    }
    //得到单链表的长度
    public int size(){
        return this.size;
    }
    public void display(){
        if ( head==null ){
            return;
        }
        Node cur=head;
        while ( cur!=null ){
            System.out.println(cur.val+" ");
        }
    }
    public void clear(){
        head=null;
    }
}

无头双向链表实现

public class MyLinkedList {

    //内部类构造一个链表数据结构
    static class ListNode{
        public int val;
        public ListNode prev;
        public ListNode next;
        public ListNode(){}
        public ListNode(int val){
            this.val=val;
        }
    }

    private ListNode first;
    private ListNode last;
    private int size=0;

    MyLinkedList(){}
    //头插法
    public void addFirst(int data){
        ListNode node=new ListNode(data);
        if ( first==null ){
            first=node;
            last=node;
        }else{
            node.next=first;
            first.prev=node;
            first=node;
        }
        size++;
    }

    //尾插法
    public void addLast(int data){
        ListNode node=new ListNode(data);
        if ( first==null ){
            first=node;
            last=node;
        }else{
            last.next=node;
            node.prev=last;
            last=node;
        }
        size++;
    }

    //任意位置插入,第一个数据节点为0号下标
    public boolean addIndex(int index,int data){
        //判断这个index是否合法
        if ( index<0 || index>size ){
            return false;
        }
        ListNode node=new ListNode(data);
        ListNode cur=first;
        for ( int i=0;i<index;i++ ){
            cur=cur.next;
        }
        if ( cur==first ){
            node.next=cur;
            cur.prev=node;
            first=node;
        }else if ( cur==last ){
            last.next=node;
            node.prev=last;
            last=node;
        }else{
            node.next=cur;
            node.prev=cur.prev;
            cur.prev.next=node;
            cur.prev=node;
        }
        return true;
    }

    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
        ListNode cur=first;
        while ( cur!=null ){
            if ( cur.val==key ){
                return true;
            }
            cur=cur.next;
        }
        return false;
    }

    //删除第一次出现关键字为key的节点
    public void remove(int key){
        ListNode cur=first;
        while ( cur!=null ) {
            if (cur.val == key) {
                //判断是不是头或尾
                if (cur == first) {
                    first=first.next;
                    if ( first!=null ){
                        first.prev=null;
                    }
                } else if (cur == last) {
                    last=last.prev;
                    last.next=null;
                } else {
                    cur.prev.next=cur.next;
                    cur.next.prev=cur.prev;
                }
                return;
            }
            cur = cur.next;
        }
    }

    //删除所有值为key的节点
    public void removeAllKey(int key){
        ListNode cur=first;
        while ( cur!=null ) {
            if (cur.val == key) {
                //判断是不是头或尾
                if (cur == first) {
                    first=first.next;
                    if ( first!=null ){
                        first.prev=null;
                    }
                } else if (cur == last) {
                    last=last.prev;
                    last.next=null;
                } else {
                    cur.prev.next=cur.next;
                    cur.next.prev=cur.prev;
                }
            }
            cur = cur.next;
        }
    }
    //得到单链表的长度
    public int size(){
        return this.size;
    }

    //输出链表的内容
    public void display(){
        ListNode cur=first;
        while ( cur != null ){
            System.out.println(cur.val);
            cur=cur.next;
        }
    }

    public void clear(){
        first=null;
        last=null;
    }
}

链表的相关题目

移除链表元素

https://leetcode.cn/problems/remove-linked-list-elements/description/

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if ( head==null ){
            return null;
        }
        ListNode pre=head;
        ListNode cur=head.next;
        while ( cur!=null ){
            if ( cur.val==val ){
                cur=cur.next;
                pre.next=cur;
            }else{
                pre=cur;
                cur=cur.next;
            }
        }
        if ( head.val==val ){
            head=head.next;
        }
        return head;
    }
}

反转一个单链表

https://leetcode.cn/problems/reverse-linked-list/description/

将每一个结点的指向翻转一下,不需要重新遍历什么的。

class Solution {
    public ListNode reverseList(ListNode head) {
        if ( head==null ){
            return null;
        }
        ListNode cur = head.next;
        ListNode pre = head;
        pre.next = null;
        while ( cur != null ){
            ListNode nextNode = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nextNode;
        }
        return pre;
    }
}

链表的中间结点

https://leetcode.cn/problems/middle-of-the-linked-list/description/

用快慢指针可以在O(n)的时间复杂度完成。

class Solution {
    public ListNode middleNode(ListNode head) {
        if ( head == null ){
            return null;
        }
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

链表中倒数第k个结点

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

用快慢指针的方法,快指针先跑k个,然后慢指针和快指针再按相同的速度跑 

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if ( head == null ){
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while (k != 0){
            if (fast != null){
                fast = fast.next;
                k--;
            }else{
                return null;
            }
        }
        while ( fast != null ){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web Components学习(1)

一、什么是web components 开发项目的时候为什么不手写原生 JS&#xff0c;而是要用现如今非常流行的前端框架&#xff0c;原因有很多&#xff0c;例如&#xff1a; 良好的生态数据驱动试图模块化组件化等 Web Components 就是为了解决“组件化”而诞生的&#xff0c;它是浏…

4.Elasticsearch深入了解

4.Elasticsearch深入了解[toc]1.Elasticsearch架构原理Elasticsearch的节点类型在Elasticsearch主要分成两类节点&#xff0c;一类是Master&#xff0c;一类是DataNode。Master节点在Elasticsearch启动时&#xff0c;会选举出来一个Master节点。当某个节点启动后&#xff0c;然…

A Star算法最通俗易懂的一个版本

01-概述虽然掌握了 A* 算法的人认为它容易&#xff0c;但是对于初学者来说&#xff0c; A* 算法还是很复杂的。02-搜索区域(The Search Area)我们假设某人要从 A 点移动到 B 点&#xff0c;但是这两点之间被一堵墙隔开。如图 1 &#xff0c;绿色是 A &#xff0c;红色是 B &…

猿创征文 | re:Invent 朝圣之路:“云“行业风向标

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AWS 亚马逊云科技re:Invent全球大会 2022年亚马逊云科技re:Invent全球大会震撼来袭&#xff0c;即将于北京时间11月30日-12月2日在美国内华达州&#xff0c;拉斯维加斯…

【MySQL】将 CSV文件快速导入 MySQL 中

【MySQL】将 CSV文件快速导入 MySQL 中方法一&#xff1a;使用navicat等软件的导入向导如果出现中文乱码方法二&#xff1a;命令行导入&#xff08;LOAD DATA INFILE SQL&#xff09;一般来说&#xff0c;将csv文件导入mysql数据库有两种办法&#xff1a; 使用 navicat、workbe…

易优cms links 友情链接调用标签

links 友情链接调用 【基础用法】 标签&#xff1a;links 描述&#xff1a;用于获取友情链接列表。 用法&#xff1a; {eyou:links typetext loop30 titlelen15} <a href{$field.url} {$field.target} {$field.nofollow}>{$field.title}</a> {/eyou:links} …

模型杂谈:快速上手元宇宙大厂 Meta “开源泄露”的大模型(LLaMA)

本篇文章聊聊如何低成本快速上手使用 Meta&#xff08;Facebook&#xff09;的开源模型 LLaMA。 写在前面 在积累点赞&#xff0c;兑现朋友提供的显卡算力之前&#xff0c;我们先来玩玩“小号的”大模型吧。我相信 2023 年了&#xff0c;应该不需要再赘述如何使用 Docker 干净…

Go的 context 包的使用

文章目录背景简介主要方法获得顶级上下文当前协程上下文的操作创建下级协程的Context场景示例背景 在父子协程协作过程中, 父协程需要给子协程传递信息, 子协程依据父协程传递的信息来决定自己的操作. 这种需求下可以使用 context 包 简介 Context通常被称为上下文&#xff…

AUTOSAR知识点Com(六):CANIf规范时序图

目录 1、概述 2、规范时序 2.1、Transmit request (single CAN Driver) 2.2、Transmit request (multiple CAN Drivers) 2.3、Transmit confirmation (interrupt mode) ​2.4、Transmit confirmation (polling mode) 2.5、Transmit confirmation (with buffering) 2.6、T…

国际物流是怎么给货物打包的

国际物流常见的包装方法有好几种&#xff0c;而且国际物流公司针对物品的包装都是格外重视&#xff0c;国际物流公司会依据物品的不同种类搭配不同的包装&#xff0c;便于物品完好无损的到的目的地。包装无论大小形态&#xff0c;它的核心目的是为了保护性、分辨性与便利性&…

使用pybind11将c++扩展为python

pybind11—python C/C扩展编译 - 简书 (jianshu.com)pybind11在Windows下的使用 - 酱_油 - 博客园 (cnblogs.com)编写 Python 的 C 扩展 - Visual Studio (Windows) | Microsoft Learn首先安装pybind11并在VS中配置安装pybind11&#xff1a;mirrors / pybind / pybind11 GitCo…

数据结构与算法---JS与栈

前言js里&#xff0c;是没有栈这种原生的数据结构。但是我们可以通过自定义创建栈类&#xff0c;来实现对添加/删除元素时更多的控制。创建栈类// 初始化一个基于数组的栈类 class Stack {constructor() {this.items [];} }为什么我们要选择数组作为栈类的存储数据类型&#x…

23.3.9打卡 AtCoder Beginner Contest 259

A题 题解 对于x特判一下就好 代码 void solve() {ll x,d;cin>>n>>m>>x>>t>>d;if(n>m){nmin(n,x);if(n<m){cout<<t;return;}cout<<(m-n)*dt;}else{mmin(m,x);cout<<(m-n)*dt;}return; }B 三角函数全还给高中老师了 题…

ARM 学习(一)

ARM 处理器的运行模式ARM处理器共有7种运行模式&#xff0c;如下表所示&#xff1a;处理器模式描述用户模式&#xff08;User&#xff09;正常程序运行模式中断模式&#xff08;IRQ&#xff09;用于通常的中断处理快速中断模式&#xff08;FIQ&#xff09;用于高速传输和通道处…

qt控件增加渐变色效果

ui->returnBtn->setStyleSheet("color: rgb(0, 0, 0);""background:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, ""stop:0 #5f5f5f, stop:0.5 #ffffff, stop:0.98 #5f5f5f);""border:none;");效果如下图&#xff1a; …

java-3月xly笔记

时间安排&#xff1a; 朱祥祥 会议号&#xff1a;417 523 3263 服务器&#xff1a;doc.canglaoshi.org jdk下载&#xff1a;https://repo.huaweicloud.com/java/jdk/ jdk配置环境变量 检测命令&#xff1a; &#xff08;1&#xff09;winr&#xff0c;输入cmd&#xff0c…

ActiveMQ反序列化漏洞原理+复现

ActiveMQ反序列化漏洞 ActiveMQ ActiveMQ是开源消息总线&#xff0c;消息中间件 工作原理 通过使用消息队列&#xff0c;实现服务的异步处理&#xff0c;主要目的是减少请求响应时间和解耦合。 消息队列&#xff0c;服务器A将客户发起的请求放入服务器B的消息队列中&#…

裸辞两个月还能不能找到工作?亲身经历告诉你结果·····

这是我在某论坛看到的一名网友的吐槽&#xff1a; 软件测试四年&#xff0c;主要是手动测试&#xff08;部分自动化测试和性能测试&#xff0c;但是用的是公司内部自动化工具&#xff0c;而且我自动化方面是弱项。&#xff09;现在裸辞两个月了&#xff0c;面试机会少而且面试…

树与二叉树(二叉树的表示,性质,遍历,还原)

基本术语&#xff1a;A&#xff08;或B&#xff09;是I的祖先&#xff0c;I是A&#xff08;或B&#xff09;的子孙&#xff1b;D是I的双亲&#xff0c;I是D的孩子&#xff1b;节点的孩子个数称为节点的度&#xff1b;树中节点的最大度数称为树的度&#xff1b;度大于0的节点称为…

Git 命令行5步解决冲突方法(亲测有效)

总体步骤如下&#xff1a; git pull --rebase 解决冲突文件 file1.c。git add file1.cgit commit -m "*****" git pushgit rebase --continue &#xff0c;此时冲突消失强推&#xff0c;git push origin xxxx -f 本人解决的例子如下&#xff1a; 第一步、拉取…