惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
I
InfoQ
博客园_首页
G
Google Developers Blog
爱范儿
爱范儿
Last Week in AI
Last Week in AI
量子位
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
月光博客
月光博客
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

蚊子的前端博客

微说 | 有的人觉得只要不考XX,一定能考好!-蚊子的前端博客 微说 | 春天来了-蚊子的前端博客 明天和意外不知道哪个先来-蚊子的前端博客 微说 | 既然错过了路口,就及时止损,重新规划路线上路-蚊子的前端博客 微说 | 2025年的出生人口数是792万-蚊子的前端博客 微说 | 工作年终总结,让写对接的接口的数量?-蚊子的前端博客 微说 | 温家宝:没有政治体制改革的成功 经济体制改革不可能进行到底-蚊子的前端博客 微说 | 违法犯罪了该不该被禁言?-蚊子的前端博客 微说 | 不明白为什么在推荐去俄罗斯旅游-蚊子的前端博客 微说 | 易中天论骗子-蚊子的前端博客 微说 | 一场大风吹散了秋天-蚊子的前端博客 微说 | 既要、又要、还要、更要!-蚊子的前端博客 又是一年的国庆雨季-蚊子的前端博客 微说 | 预估下2025年的出生人口数据-蚊子的前端博客 微说 | 可惜了我那些小时候的书本-蚊子的前端博客 微说 | 牛马有的是,驴不够了!-蚊子的前端博客 微说 | 能否有一条非户口也能高考的路-蚊子的前端博客 微说 | 小聊中医-蚊子的前端博客 微说 | 将要制作的一款新产品-蚊子的前端博客 微说 | 做人要有信-蚊子的前端博客 微说 | 好一个正义联盟-蚊子的前端博客 微说 | 都是见过吃过的主儿-蚊子的前端博客 微说 | 追求8小时工作制有错吗?-蚊子的前端博客 微说 | 如果尖锐的批评完全消失-蚊子的前端博客 微说 | 很好!-蚊子的前端博客 微说 | 封禁用户可以,但要告知具体原因-蚊子的前端博客 微说 | 面朝大海,春暖花开-蚊子的前端博客 微说 | 程序员的悲哀是什么?-蚊子的前端博客 微说 | 2025年出生人口的预测-蚊子的前端博客 前端在 LiveKit 中如何获取所有的参与者-蚊子的前端博客
leetcode 的单向链表与数组的转换-蚊子的前端博客
author · 2022-06-21 · via 蚊子的前端博客

在 leetcode 的单向链表的题目中,通常会以数组的形式给出数据,导致我们在本地调试时,非常不方便。跟之前我们修改二叉树的样例一样:将 leetcode 中二叉树的数组结构转为真实的树结构

这里我们写两个转换程序,实现单向链表和数组的双向转换。

在 C++ 的语言中,leetcode 官方给出的链表结构:

struct ListNode
{
    int val;
    ListNode *next;

    ListNode() : val(0), next(nullptr)
    {
    }

    ListNode(int x) : val(x), next(nullptr)
    {
    }

    ListNode(int x, ListNode *next) : val(x), next(next)
    {
    }
};

1. 数组转单向链表 #

访问单向链表通常有循环和递归两种方式,这里转换时,我们也用两种方式来实现。

1.1 循环的方式 #

采用循环的方式,最需要注意的一点是头指针的处理,头指针的指向是不能跟着循环一起移动,需要单独处理。

/**
 * 数组转单向链表的循环方式
 * @param {vector<int>} nums 数组
 * @return {ListNode*} 构建的链表
 */
ListNode *vectorToListNode(vector<int> nums)
{
    if (nums.empty())
    {
        return nullptr;
    }
    auto head = new ListNode(nums[0]); // 头指针
    auto prev = head;
    for (int i = 1; i < nums.size(); i++) {
        auto node = new ListNode(nums[i]); // 创建一个新节点
        prev->next = node; // 上一个节点的next指向到当前节点
        prev = prev->next; // 将指针从上个节点移动到当前节点
    }
    return head;
}

1.2 递归的方式 #

使用递归的方式时,我这里传了一个下标过去,表示当前处理的是哪个节点。

/**
 * 数组转单向链表的递归方式
 * @param {vector<int>} nums 数组
 * @param {?int} index 数组的下标
 * @return {ListNode*} 构建的链表
 */
ListNode *vectorToListNode(vector<int> nums, int index = 0)
{
    if (index >= nums.size())
    {
        return nullptr;
    }

    auto node = new ListNode(nums[index]);
    // 递归下一个节点,并用next指向到下一个节点
    node->next = vectorToListNode(nums, index + 1);
    return node;
}

上面无论是哪种转换方式,使用方式都是一样的。

vector<int> nums = {1, 2, 3, 4, 5};
auto head = vectorToListNode(nums);
while (head) {
    cout << head->val << endl;
    head = head->next;
}

2. 单向链表转数组 #

链表转数组最简单的方式就是循环的方式了,直到链表的最后一个节点截止。

/**
 * 单向链表转数组
 * @param {ListNode*} head 链表的头指针
 * @return {vector<int>} 数组
 */
vector<int> ListNodeToVector(ListNode *head)
{
    vector<int> nums;

    while (head)
    {
        nums.push_back(head->val);
        head = head->next;
    }
    return nums;
}

3. 测试 #

我们可以在 leetcode 中选择一个题目来测试下:剑指 Offer 06. 从尾到头打印链表