不用指针实现链表

作者: Beryllium | 来源:发表于2016-08-13 21:25 被阅读359次

链表通常的实现方式是,定义结构体和指针,在结点与结点之间随心所欲插入新的结点。
而在刘汝佳的《算法竞赛入门经典》中,提出了另一种"双数组"(s数组和next数组)实现方式。代码如下。(结合输出部分代码来理解)

for (int i = 1; i <= n; i++)
    char ch = s[i];
    if (ch == '[')cur = 0;//将光标移动到链表首部
    else if (ch == ']')cur = last;//光标移动到链表尾部
    else{//在光标所在位置插入节点
        next[i] = next[cur];
        //如果光标后的位置已经被赋值,则这个值被“插队”了。
        //将这个值赋给next[i]。因为在输出时,这里的next[i]
        //将是下一个被输出的字符的位置。
        //比如cur=10,i=8,则next[8]=next[10];next[10]=8;
        //在输出时,光标先被导向到10,输出s[next[10]],
        //接着被导向到next[10],亦即8,输出s[next[8]]
        next[cur] = i;//将光标后的位置赋值为i(输出时输出s[i])
        if (cur == last)last = i;//如果光标被移动到了最后,将last值更新
        cur = i;
        //不管此前光标在首部(cur==0)还是尾部(cur==last)还是中间,i都是光标的下一个位置。
        //因为next[cur]=i。
    }
}```
输出代码如下。

for (int i = next[0]; i != 0; i = next[i])
printf("%c", s[i]);
printf("\n");


PS:
我爱指针,指针使我快乐。

相关文章

  • 不用指针实现链表

    链表通常的实现方式是,定义结构体和指针,在结点与结点之间随心所欲插入新的结点。而在刘汝佳的《算法竞赛入门经典》中,...

  • 数据结构 — 静态链表

    单链表的相对劣势 单链表的实现严重依赖指针 数据元素中必须包含一个额外的指针域 没有指针的程序设计语言无法实现 静...

  • leetcode 单链表的各种算法

    1 递归实现:合并两个有序的单链表 2 递归实现:单链表逆序存入vector 3 循环实现:快慢指针找到单链表中间...

  • Redis有这一篇就够了

    Redis 数据结构 链表:列表建的底层实现(头指针和尾指针的双端链表) 字典:哈希键的底层实现 使用链地址法(数...

  • 用JavaScript实现双向链表

    用JavaScript实现双向链表 前言 JavaScript本身是没有指针的,所以要实现链表的话没有现成的数据结...

  • 0876-链表的中间结点

    链表的中间结点 方案一 使用快慢指针 借助单链表实现 C-源代码

  • java容器-LinkedList-大概了解

    LinkedList底层使用双向链表来实现,其中每个节点的数据如下,有数据项,前驱指针,后继指针三个元素 双向链表...

  • List(二):LinkedList源码分析

    LinkedList以双向链表实现,链表无容量限制,但是双向链表本身就使用了更多的空间,也需要额外的链表指针操作....

  • 基础算法学习与实践

    数组&链表 1. 快慢指针的方式实现判断链表是否有环 栈和队列 1. 栈实现队列(负负得正) ...

  • C语言结构体实现线性链表

    利用C语言的结构体和指针链表的相关知识,自己动手敲了下实现类似链表的功能。 创建方法 实现功能是接受用户输入链表长...

网友评论

本文标题:不用指针实现链表

本文链接:https://www.haomeiwen.com/subject/wlcysttx.html