首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >简单祈使双链接列表

简单祈使双链接列表
EN

Code Review用户
提问于 2016-10-29 13:33:55
回答 1查看 293关注 0票数 0

我已经开始学习C++,并且还在做我的第一个程序。这是我上一篇文章的续集

我最初的目的是在专业层面上列出一份相互关联的清单。但现在已经将其更改为双链接列表,以简化代码。它实现了几个公共功能,可以显着地提高列表的可用性。

我还试图实现一个内部迭代器。但是没有看到为内部使用的双向迭代器来代替getNode的好处。

虽然我认为我改进了我上一篇文章中提到的所有问题。我主要集中在执行哨兵。我不认为这是哨兵,因为它所做的不只是我的结束条件。所以我很想得到一些关于我的实施情况的反馈。但是所有的批评都是被通缉的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

template <class T>
class LinkedList {
private:
    class Node {
    public:
        Node* next;
        Node* prev;
        T data;
        // For the sentinal
        Node(): data('\0'), prev(this), next(this) {}
        Node(T data, Node* before)
                : data(data) {
            prev = before;
            next = before->next;
            prev->next = this;
            next->prev = this;
        }
        ~Node() {
            prev->next = next;
            next->prev = prev;
        }
        Node(Node const&)            = delete;
        Node& operator=(Node const&) = delete;
    };
    Node sentinal;
    Node* getNode(int index) {
        if (index >=  0) {
            int i = 0;
            for (Node* node = sentinal.next; node != &sentinal; node = node->next) {
                if (i == index) {
                    return node;
                }
                i++;
            }
        } else {
            int i = -1;
            for (Node* node = sentinal.prev; node != &sentinal; node = node->prev) {
                if (i == index) {
                    return node;
                }
                i--;
            }
        }
        throw std::out_of_range("List doesn't contain that item.");
    }
public:
    LinkedList() {}
    ~LinkedList() {
        clear();
    }
    LinkedList(LinkedList const&)            = delete;
    LinkedList& operator=(LinkedList const&) = delete;

    void clear() {
        while (sentinal.next != &sentinal) {
            delete sentinal.next;
        }
    }

    int length() {
        int length = 0;
        for (Node* node = sentinal.next; node != &sentinal; node = node->next) {
            length += 1;
        }
        return length;
    }

    void append(T data) {
        new Node(data, sentinal.prev);
    }

    T get(int index) {
        return getNode(index)->data;
    }

    void insert(T data, int index) {
        new Node(data, getNode(index)->prev);
    }

    T pop(int index=-1) {
        Node* node = getNode(index);
        T data = node->data;
        delete node;
        return data;
    }
};

int main() {
    LinkedList<char> list;
    list.append('h');
    list.append('l');
    list.append('l');
    list.append('l');
    list.append('o');
    list.insert('e', 1);
    std::cout << list.pop(2) << list.get(-1) << '\n';
    for (int i=0; i < list.length(); i++) {
        std::cout << list.get(i);
    }
    std::cout << '\n';
    list.clear();
    std::cout << list.length() << '\n';
}
EN

回答 1

Code Review用户

发布于 2016-10-29 15:25:23

  • getNode不替换迭代器。它总是从列表的开头开始。这意味着扫描列表具有二次时间复杂度。
  • Node默认构造函数是可疑的。它假定T可以由NUL字符构造。这似乎是一个不必要的限制。假设T本身有一个默认的构造函数,并且使用它更符合逻辑。
  • length()方法具有恒定的时间复杂度。线性的,充其量是令人惊讶的。我建议成为一个成员,在每次插入时增加,每次删除时减少。
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/145626

复制
相关文章
图像翻转
算法:图像翻转是用于对图像进行镜像翻转处理。水平翻转用于对图像进行水平方向上镜像处理;垂直翻转用于对图像进行垂直方向上镜像处理。对角翻转用于对水平方向上和垂直方向上镜像处理。图像翻转不是图像反转。图像翻转可以通过图像旋转获得。图像翻转应用在图像增强、网页设计等领域。
裴来凡
2022/05/28
1.3K0
图像翻转
opencv图像翻转、图像旋转
淼学派对
2023/10/14
3330
opencv图像翻转、图像旋转
LeetCode - 翻转图像
原题地址:https://leetcode-cn.com/problems/flipping-an-image/
晓痴
2019/08/06
5500
LeetCode - 翻转图像
SilverLight实现绕垂直中线翻转效果
主要通过StoryBoard来控制PlaneProjection的RotationY来实现
MJ.Zhou
2022/05/07
4430
Silverlight制作逐帧动画
打算用sl来制作一个游戏,我曾经有flash开发游戏的经验.现在想用sl来做.打算记录下我开发游戏探索的过程. 打开http://www.emu-zone.org/www3/host/emugif/
用户1172164
2018/01/16
1K0
Silverlight制作逐帧动画
Silverlight初级教程-动画
Silverlight初级教程 动画 在这一节里将要用到在“认识工作区”中提到的时间抽了。这里将和学习flash的过程一样做一个最简单的动画。 silverlight中的动画是以“storyboard”的形式表现出来。“storyboard”你可以认为是flash中的时间轴。  flash中只有一个时间轴,而在silverlight中却可以有多个“storyboard”。 在flash中是有一个帧频的概念的,例每秒12帧、每秒30帧等。而在silverlight中则是完全的基于时间的,例
用户1172164
2018/01/16
6190
用silverlight做动画-相机
用silverlight做动画-相机 适合初学者学习 做一个相机的动画 和做flash动画一样,准备好素材 将素材放入项目中 开始正式制作前为了方便以后重用,就把这个动画做成usercontrol(和flash中的‘MovieClip’概念是一样的) 创建一个UserControl 图片放入舞台中并且调整好位置 用钢笔在最上层画一个图像做遮罩使用,和flash中的概念一样。 讲上边的小图放入一个Canvas容器中 选中Canvas容器和刚刚画出的图形制作遮罩 将刚刚遮罩过的Canvas容器
用户1172164
2018/03/01
8610
CSS骰子翻转动画
---- <!doctype html> <html> <head> <meta charset="utf-8"> <title>CSS3骰子翻转动画</title> <style> body { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; col
我不是费圆
2020/12/17
5940
OpenCV之图像翻转
python代码: import cv2 as cv import numpy as np src = cv.imread("./test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) # X Flip 倒影 dst1 = cv.flip(src, 0); cv.imshow("x-flip", dst1); # Y Flip 镜像 dst2 = cv.flip(src, 1); cv.imshow(
MachineLP
2021/07/19
3040
OpenCV之图像翻转
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。
Eastmount
2021/12/02
5.8K0
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
LeetCode 832. 翻转图像
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
freesan44
2020/06/03
2300
OpenCV图像处理(八)---图像缩放VS图像翻转
牛顿第三运动定律的常见表述是:相互作用的两个物体之间的作用力和反作用力总是大小相等,方向相反,作用在同一条直线上。该定律是由艾萨克·牛顿在1687年于《自然哲学的数学原理》一书中提出的。牛顿第三运动定律和第一、第二定律共同组成了牛顿运动定律,阐述了经典力学中基本的运动规律。
用户5410712
2022/06/01
7620
OpenCV图像处理(八)---图像缩放VS图像翻转
[UWP]使用CompositionAPI的翻转动画
在 使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow) 这篇文章里我介绍了一个包含长阴影的番茄钟,这个番茄钟在状态切换时用到了翻转动画,效果如上所示,还用到了弹簧动画,可以看到翻转后有点回弹。本来打算自己这个动画效果写的,但火火已经写好了这个FlipSide控件,Github地址在这里,这篇文章就介绍下这个控件的部分原理。
dino.c
2019/11/14
7610
LeetCode 0832. 翻转图像
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 1, 1, 0 的结果是 0, 1, 1。
Yano_nankai
2021/02/23
2040
LeetCode 0832. 翻转图像
cv图像翻转,EmguCV图像旋转「建议收藏」
i use this codeprivate void button12_Click(object sender, EventArgs e)
全栈程序员站长
2022/07/25
7270
Qt官方示例-Qml翻转动画
❝示例演示翻转动画(沿着x轴或y轴翻转动画)。❞ 主要代码: import QtQuick 2.0 Flipable { id: container property alias source: frontImage.source property bool flipped: true property int xAxis: 0 property int yAxis: 0 property int angle: 0 width: front.
Qt君
2023/03/17
7630
Qt官方示例-Qml翻转动画
Python图像增强(翻转和旋转)
在训练神经网络的时候,经常需要对原始图像做各种各样的增强来增加数据量,最常见的也就是旋转和翻转操作了,实现这两种操作也多种多样,本博客就是来探究不同操作带来的结果
用户7886150
2021/01/05
2.4K0
TensorFlow 图像预处理(二) 图像翻转,图像色彩调整
本文介绍了TensorFlow中的图像预处理方法,包括图像翻转、图像色彩调整、图像归一化等操作。通过这些操作,可以有效地提高图像的质量和可用性。同时,文章还介绍了如何使用TensorFlow进行图像增强和预处理,以便在训练模型时获得更好的性能。
chaibubble
2018/01/02
1.9K0
TensorFlow 图像预处理(二) 图像翻转,图像色彩调整
09:图像旋转翻转变换
09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。 其中,可能的操作及对应字符有如下四种: A:顺时针旋转90度; B:逆时针旋转90度; C:左右翻转; D:上下翻转。 输入第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。 接下来m行,每行n个整数,表示图像中每个像素点的灰度值,相邻两个数之间用单个空格隔开。灰度值
attack
2018/04/03
1.8K0
Leetcode#832. Flipping an Image(翻转图像)
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
武培轩
2018/09/28
3780

相似问题

翻转动画后Silverlight屏幕模糊

10

Android翻转图像动画

20

CSS动画:如何翻转图像?

226

jQuery动画图像翻转

33

在动画过程中翻转图像

123
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文