如何根据数组或者字符串创建链表?

c语言 将字符读取到单链表 最近在做课设,想要实现一个从.txt文件读取内容,放置到存入链表的功能,查了下百度,没有一模一样可以参考的代码,遂自己动手丰衣足食,c语言新手,写法可能存在问题,请各位见谅并提出意见。 单链表定义 struct ListNode { char name[20]; int score; ListNode*next; }; typedef struct ListNode ... 阅读详情

***By Long Luo***

在[Leetcode](https://leetcode-cn.com/problemset/all/)做[链表](https://leetcode-cn.com/tag/linked-list/)相关的题时,给出的测试用例总是数组或者字符串形式,比如[61. 旋转链表](https://leetcode-cn.com/problems/rotate-list/)这道题,Testcase如下所示:

**示例 1:**

![img](https://upload-images.jianshu.io/upload_images/577271-49b58ba7650ff071.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>输入:head = [1,2,3,4,5], k = 2
>输出:[4,5,1,2,3]

# 问题

如果在本地测试代码时,每次测试代码的时候,都需要自己创建测试用例,或者调用leetcode给的例子,都需要手动去创建一个链表的话,但这样效率太低!针对这种情况,写了几个工具函数用来处理链表的代码,可供大家参考。

<!--more-->

# 测试代码

个人测试链表测试代码如下:

```java
public static void main(String[] args) {
    ListNode test1 = LinkedListUtils.constructListNode(new int[]{1, 2, 3, 4, 5});
    System.out.println("[4,5,1,2,3] ?=" + LinkedListUtils.printLinkedList(rotateRight(test1, 2)));

    ListNode test2 = LinkedListUtils.constructListNode(new int[]{0, 1, 2});
    System.out.println("[2,0,1] ?=" + LinkedListUtils.printLinkedList(rotateRight(test2, 4)));
}
```

# 打印链表

Leetcode上链表最后输出形式:

> 输出:[4,5,1,2,3]

打印方法很简单,代码如下所示:

```java
    public static String printLinkedList(ListNode head) {
        if (head == null) {
            return "[]";
        } else if (head.next == null) {
            return "[" + head.val + "]";
        }

        StringBuilder sb = new StringBuilder();
        sb.append("[");
        while (head.next != null) {
            sb.append(head.val);
            if (head != null) {
                sb.append(",");
            }
            head = head.next;
        }
        sb.append(head.val).append("]");

        return sb.toString();
    }
```

# 如何创建一个链表?

## 通过int数组创建链表

由一个给定的数组来创建一个链表,这个很简单,只需要遍历输入的数组,然后根据各个元素创建链表的节点的对象,然后把各个对象链接起来即可。

```java
    public static ListNode constructListNode(int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            return null;
        }

        ListNode dummyNode = new ListNode(-1);
        ListNode preNode = dummyNode;
        for (int i = 0; i < numbers.length; i++) {
            ListNode currNode = new ListNode(numbers[i]);
            preNode.next = currNode;
            preNode = preNode.next;
        }

        return dummyNode.next;
    }
```

注意:这里使用了链表操作常用的技巧,**使用一个dummyNode作为链表的起始节点**。这样做的好处是使后面所有节点的操作完全相同,否则链表中的第一个节点的操作要特殊处理,这样可以减少冗余代码,提高效率(不同多次判断是否为头节点),并且即使为空链表,也不需要特殊考虑。

## 通过字符串创建链表

上一小节,我们实现了通过int数组得到了链表的方法,但Leetcode中还有通过字符串来构建链表,而字符串又有多种形式。总结有以下几种方式:

```txt
"1->2->3->4->5->NULL"
"1->2->3->4->5->null "
" 1->2->3->4->5"
"[1, 2, 3, 4 ,5]"
"[1, 2, 3, 4 ,5, NULL]"
"[1, 2, 3, 4 ,5, null]"

注意:
   1. 字符串前后中间可以有空格
   2. NULL为大写或小写均可
```

有了上一节构造链表的方法,我们可以先将字符串处理成整型数组,然后调用`constructListNode(int[] numbers)`来构造链表。

处理思路如下:
1. 去除字符串中全部空格;
2. 如果前后有中括号`[]`,先去除括号,再按照逗号`,`调用`split`进行分割数组;
3. 如果中间有箭头`->`,调用`split`进行分割数组;
4. 遇到最后的`NULL`或者`null`,设置为空。

代码如下所示:

```java
    public static ListNode constructListNode(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }

        String listStr = str.replaceAll(" ", "");
        String[] numbersStrArray;
        if (listStr.charAt(0) == '[' && listStr.charAt(listStr.length() - 1) == ']') {
            listStr = listStr.substring(1, listStr.length() - 1);
            numbersStrArray = listStr.split(",");
        } else if (listStr.contains("->")) {
            numbersStrArray = listStr.split("->");
        } else {
            numbersStrArray = new String[1];
            numbersStrArray[0] = listStr;
        }

        int numLength = 0;
        if (numbersStrArray.length > 1) {
            if (numbersStrArray[numbersStrArray.length - 1].equalsIgnoreCase("null")) {
                numLength = numbersStrArray.length - 1;
            } else {
                numLength = numbersStrArray.length;
            }
        } else {
            numLength = 1;
        }

        int[] numbers = new int[numLength];
        for (int i = 0; i < numLength; i++) {
            numbers[i] = Integer.parseInt(numbersStrArray[i]);
        }

        return constructListNode(numbers);
    }
```

测试代码如下:

```java
    public static void main(String[] args) {
        System.out.println(printLinkedList(constructListNode("1->2->3->4->5->NULL ")));
        System.out.println(printLinkedList(constructListNode(" 1->2->3->4->5")));
        System.out.println(printLinkedList(constructListNode(" 1->2->3->4 ->5 -> null ")));
        System.out.println(printLinkedList(constructListNode("[1, 2, 3, 4 ,5]")));
        System.out.println(printLinkedList(constructListNode("[1, 2, 3, 4 , 5, null]")));
        System.out.println(printLinkedList(constructListNode("[1,  2, 3, 4 , 5, NULL]")));
    }
```

# 小结

上述代码集成在LinkedListUtils类中,包含:
1. `printLinkedList(ListNode head)`,打印一个链表的方法;
2. 两个创建链表的方法: `constructListNode(int[] numbers)`,由整型数组创建;`constructListNode(String str)`,由字符串创建。

本文来源:[如何根据数组或者字符串创建链表?](http://www.longluo.me/blog/2020/12/10/Construct-A-LinkedList-From-An-Array-Or-String/)

C++复习--链表数组 1.动态数组的创建 //动态数组的创建 int cloum, row; //申请空间 int **a = new int*[cloum]; for (int i = 0; i < cloum; i++) { a[i]=new int* [row]; } 阅读详情

相关推荐

通过给定的数组构造一个链表

import java.util.List; /** * @author f242 * @since V1.0.0 * 2020-03-22 18:24 */ public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } /** ...

cui1004的博客 1130

字符串链表 c语言,C语言怎样将字符串转换为链表以及将链表转换成函数

#includetypedefstructnode{charch;structnode*next;}*LinkList,*pNode;LinkListGetEmptyList(){LinkListhead=(pNode)malloc(sizeof(structnode));head->next=NULL;head->ch=0;returnhead;}...

weixin_39882870的博客 2973

根据文件中的字符串生成单链表

#include #include #define ElemType char typedef struct LNode {//链表结点结构的定义 ElemType data; struct LNode *next; }LNode,*LinkList; int CreateList(LinkList &head) {//由文件中的字符串生成单链表 //定义文件输入

愿君出走半生,归来时仍是少年 2156

c语言字符串转为单链表,C语言教程:链表的建立、插入和删除(转)

C语言教程:链表的建立、插入和删除数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要30个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。我们希望构造动态的数组,随时可以调整数组的...

weixin_39665992的博客 803

Code Ocean 上传代码 手把手教程

对于一些学术期刊,录用前会让把代码上传到Code Ocean上,但上传过程可能会遇到一些问题,小编分享一下自己的上传经验。他们会进行验证,验证通过,将自动发布。点此运行即可,但是运行比较慢。

u014071947的博客 1万+

【Niagara Vykon N4 】物联网学习 03照明控制及照明时间表

3.1 设计思路 3.2逻辑组件添加 ①依据原有控制照明逻辑,打开palette,找到schedule模块,添加BoolenSchedule。 ②打开kitContrl,找到Util,并添加BoolenSwitch。 ③剪切到原有的逻辑线,并进行逻辑连接,如下图。 ④新建BooleanWritable,命名为Switch,设置参数并进行逻辑连接,若下图。 3.3界面设计 ⑤至此完成了逻辑的设...

weixin_45217107的博客 2862

C语言—单链表的创建与插入操作

C语言—单链表的创建与插入操作

Char_kar的博客 2605

Open3D DBSCAN聚类

DBSCAN算法做为一种有名的密度聚类算法,它是通过邻域参数(Distance,MinPts)来刻画样本分布的紧密程度。而在真正开始之前,首先要理解下面这几个概念:更为具体的内容也可参考这篇文章点云DBSCAN聚类算法。...

dayuhaitang1的博客 1794

如何通过数组或字符串直观地创建链表

在前段时间集中做了leetcode上树的相关的题目之后,最近准备做链表相关的题目了。与之前的问题相同,如果每次测试代码的时候,自己创建测试用例,或者调用leetcode给的例子,都要手动去创建一个链表的话,效率未免太低,也会打断做题时候的思路,因此,也整理出了一个用来创建链表的代码,贴出来以供参考。 相关文章 这里有可以参考的创建和直观展示一棵树的方法: 如何直观地打印一棵树 如何直观地创建一...

lenfranky的博客 1235

C# 与 PaddleOCR:一行代码实现高效图片文字识别的实战指南

本文介绍了如何使用 PaddleOCRSharp 进行图像文字识别,涵盖了从环境准备到高级功能的完整流程。首先,通过 NuGet 安装 PaddleOCRSharp 并下载预训练模型。接着,展示了单张图片识别的最小化示例和详细实现,包括模型配置、图片预处理和结果输出。进阶功能部分介绍了多语言和竖排文本识别的实现方法。此外,文章还提供了 WinForms 图形界面开发的完整示例,展示了如何通过界面加载图片、执行识别并展示结果。最后,探讨了批量处理优化策略,如并行处理多张图片以提高性能。通过这些步骤,开发者可以

墨夶的博客 1004

让 ABAP 开发者也能做出高质量 SAP Fiori:到底需要掌握多少前端知识?

文章摘要: 随着SAP技术演进,ABAP开发者的角色边界正在重构。传统SAP GUI时代的全栈开发模式逐渐转向RAP+Fiori Elements的新范式,其中关键技术变化包括: 开发模式转变:从前后端耦合转向RAP模型驱动开发,通过CDS注解实现UI意图表达 分工优化:Fiori Elements模板处理80%标准UI需求,Flexible Programming Model解决20%差异化需求 效率提升:注解驱动开发可在RAP建模阶段同步定义UI结构,大幅缩短交付周期 工具整合:SAP提供从建模到部署的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 348

IDL变量(数组,字符串,结构体,链表,哈希表)(三)

文章目录数组1.创建数组2.数组常用函数3.数组的动态扩展字符串1.创建字符串2.字符串常用函数结构体1.创建结构体2.结构体的使用链表和哈希表1.创建链表2.链表的使用3.哈希表4.哈希表的功能 数组 1.创建数组 2.数组常用函数 详细函数使用参考博客: 1.https://www.cnblogs.com/wintertone/p/6596672.html 2.https://blog.cs...

花藻の博客 3643

Python全栈入门到实战【基础篇 04】核心基础:变量与4种基础数据类型(int/float/str/bool)

本文介绍了Python编程中的变量和四种基础数据类型,作为后续所有语法的入门前提。变量是数据的“容器”,解决数据复用问题,而数据类型决定数据能进行的操作。文章详细讲解了变量的定义语法、命名规则(强制语法和推荐风格)、赋值与修改原理,并通过实操示例展示其应用场景。正确使用变量可以提升代码复用性、简化修改并增强可读性,是编程效率的核心原则。掌握这些基础知识能避免90%的新手语法错误,为学习更复杂的Python语法打下坚实基础。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4307

根据数组创建二叉树【DS + C++】

主要是利用数组生成二叉树。 更新了运行流程。

物联黄同学的博客 5018

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1685

【华为OD机试真题 2025B卷】737、统计监控器、需要打开多少监控器 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025B卷】737、统计监控器、需要打开多少监控器 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为

KJ.JK 715

数组转链表,链表转数组

一、数组转链表: 整形 Integer[]a = {2,5,3,1,10,4,443,787,7684,46,74,4-424,4343,4,-4,34,54}; List s = Arrays.asList(a); 浮点型 Double[]a = {2d,5d,3d,1d,10d,4d,443d,787d,7684d,46d,74d,-424d,4343d,4d,-4d,34d,54d}; Li...

qq_40131465的博客 5744

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数组总结以及数组链表

a

weixin_43541094的博客 181

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DAY67:数组、链表、字符串、哈希表的刷题小结

找到环的入口位置,也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。原地移除数组上的元素,数组上的元素,不能真正的删除,因此只能覆盖。pre和cur一前一后,先将cur-next保存好,然后将pre连接到cur-next上,将pre箱右移动,cur向右移动。设计快慢指针,low走一步和fast走两步,如果两个指针相遇了,说明链表有环,不然快指针会一直比慢指针快。这题的hash表,是以数组实现的,因为字母只有26个,所以只需要26个数字的数组。设计一个节点来保存当节点的下一个。

weixin_43799497的博客 1056

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JZoffer(数组;字符串;链表)

1.旋转数组的最小数字(数组查找);奇数位于偶数前;和位s的两个数字 2.摩尔投票法解决众数问题:数组中出现次数过半的数字 “剪枝”进行重复计算的处理(剪枝也关系到回溯算法) 3.字符串替换;字符串转整数;字符串排列组合 4.翻转单词顺序 5.从头到尾打印链表...............

m0_58006481的博客 402

数据结构(一)-字符串、数组与链表

先回顾时间复杂度和空间复杂度,并深入最简单的数据结构-数据和链表的内存结构

gonghaiyu的博客 616

数据结构(字符串、数组、链表、栈、队列、数)

字符串: 由于无法直接修改字符串里的字符,一般情况下先把字符串变换为字符数组,然后在进行分析和处理 数组: 优点: 构建非常简单 能在 O(1) 时间里根据数组的下标(index)查询某个元素,时间效率高,可以用来实现“哈希表” 缺点: 构建时必须分配一段连续空间来顺序存储数据。创建时需要预先分配内存,经常会有空闲的区域没有得到充分利用,空间效率低 查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数) 删除和添加某个元素时,同样需要耗费 O(n) 的时间

极客 550

基于字符串数组的单链表的表示与实现

基于字符串数组的单链表的表示与实现 #pragma warning(disable:4996) #pragma warning(disable:6011) #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define NAME_NUMBER 50 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #defi

如影随形的博客 589

【C语言】指针进阶实践(指针数组和创建单链表)

目录 1、指针数组 2、单链表创建 1、指针数组 编写程序,输入n(n<10)个字符,输出其中最长字符串的有效长度。要求自定义函数int max_len(char *s[] , int n),用于计算有n个元素的指针数组n中最长的字符串的长度。 注意事项: 在使用malloc动态申请内存空间时如涉及到多维数组的申请不可一次全部申请,需分维度申请先一级后二级。具体操作...

永远年轻 永远热泪盈眶 852

力扣-数组/字符串/链表

记录,用于复习

weixin_44965579的博客 545
上一篇: 使用Hugo搭建个人网站
下一篇: 如何根据数组创建二叉树和打印二叉树?
tcpipstack
博客等级 码龄14年 329粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值