指向链表的指针什么时候会改变实际的链表?

2023-11-21

我有一个单链表 L,并创建一个指向该列表 P 的指针。似乎有时修改 P 会更改实际列表,而其他时候修改 P 对实际列表 L 没有任何作用,只会更改 P 所指向的内容到。

假设我创建一个指向 L 的指针,P = L(在 python 中)。执行类似 P = P.next 的操作会使 L 保持不变,但 P.next = P.next.next 会更改 L。同样,通过修改 P.data 来更改存储在列表中的实际数据实际上会更改 L.data。

为什么会出现这种情况?我觉得我错过了一些关于指针/引用的基本知识。

class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

    def addNode(self, val):
        root = self
        while root.next is not None:
            root = root.next
        root.next = Node(val)

    def iterateLL(self):
        root = self
        print
        while root is not None:
            print(str(root.val) + " ", end="")
            root = root.next
        print()

if __name__ =="__main__":
    L = Node(1)
    L.addNode(2)
    L.addNode(3)
    L.addNode(4)

    # iterate through list and print:
    L.iterateLL()

    # changing value of pointer does not affect L
    P = L
    P = P.next
    L.iterateLL() # L is unchanged

    # changing "next" value of pointer does affect L
    P = L 
    P.next = P.next.next
    L.iterateLL() # now we've skipped node 2

    # changing data of pointer does affect L
    P = L
    P.val = 10
    L.iterateLL()

上面的代码执行后输出如下(第一行显示原始链表,第二行显示指针 P 更改后链表未更改,而第三行和第四行显示链表已更改)

1 2 3 4

1 2 3 4

1 3 4

10 3 4

这里发生了什么?为什么改变 P 不会影响 L,但改变 P.next 和 P.val 会影响?如果所有这些操作的行为方式相同,也不会改变指针always更改链表(因此 P = P.next 应该通过删除第一个节点来修改 L),或者never更改链表(因此 P.next = P.next.next 应该保持 L 不变)?

我有一种感觉,这与 L.next 是一个指针有关,就像 P.next 一样。因此修改 P.next 最终会修改 L.next 指向的内容(?)。但我觉得规则对我来说不太清楚。


In most在 Python 中,当你对变量执行赋值时,P在这种情况下,值P改变了,但它最初引用的对象没有改变。这是因为 Python 变量只是对象的引用/指针。这是一个例子:

var1 = "test1"
var2 = "test2"
var3 = var1 # var3 = "test1"
var1 = var2 # var1 = "test2"

print(var1) # "test2"
print(var2) # "test2"
print(var3) # "test1"

那么这里发生了什么?我们只是改变这些变量指向的内容,而不是改变底层对象。

现在,在您的情况下,您执行以下操作:

# changing value of pointer does not affect L
P = L
P = P.next
L.iterateLL() # L is unchanged

当你这样做时P = L and P = P.next,你只需改变变量的内容P正在指向。您没有对底层对象进行更改P指着。让我们想象一下。

Original Configuration: Original Configuration

P = L

P = L

P = L.next

P = L.next

然而,当你这样做时

P = L
P.next = P.next.next
L.iterateLL() # we've now skipped node two

您正在更改对象的属性P正在指向。您正在设置属性P.next指向P.next.next。您实际上并没有对底层对象进行更改P.next原本是指的。通过这样做,该对象P.next最初指向超出范围并被垃圾收集器清理。

P.next = P.next.next

P.next = P.next.next

根据您的代码判断,我认为您在这种情况下的预期行为是删除L从 LinkedList 中得到一个像“2 3 4”这样的列表。为了实现这一点,应该足以做到L = L.next。这将导致第一个节点超出范围,垃圾收集器应该清理它。

作为一个快速警告,我在most在某些情况下,赋值不会更改变量所指向的对象。然而,属性有点不同。他们重写了__set__魔术方法,它允许您使用赋值运算符编辑底层对象。这里的情况并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指向链表的指针什么时候会改变实际的链表? 的相关文章

  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • Python]将两个文本文件合并为一个(逐行)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是蟒蛇新手 我想做的是将文件 a 和文件 b 逐行合并到一个文件中 例如 text file a a n b n c text fi
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 是否可以将 pd.Series 分配给无序 pd.DataFrame 中的列而不映射到索引(即不重新排序值)?

    在 Pandas 中创建或分配新列时 我发现了一些意外的行为 当我对 pd DataFrame 进行过滤或排序 从而混合索引 然后从 pd Series 创建新列时 Pandas 会重新排序该系列以映射到 DataFrame 索引 例如 d
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X

随机推荐

  • cgi.FieldStorage如何存储文件?

    所以我一直在尝试原始 WSGI cgi FieldStorage 和文件上传 我只是不明白它如何处理文件上传 起初 它似乎只是将整个文件存储在内存中 我想嗯 这应该很容易测试 大文件应该会堵塞内存 但事实并非如此 不过 当我请求文件时 它是
  • 如何配置 WebStorm 为 KoaJS 提供代码补全?

    目前 WebStorm 报告 KoaJS 的方法未定义 这是一个轻微但持续的烦恼 我在网上搜索过 也搜索过WebStorm的配置对话框 但没有结果 有人将 WebStorm 与 KoaJS 一起使用并且智能感知 代码完成正常工作吗 这是一个
  • 我们如何使用 TriggerDagRunOperator 触发多个气流 dag?

    我有一个场景 其中特定的 dag 完成后需要触发多个 dag 已使用 TriggerDagRunOperator 触发单个 dag 是否可以将多个 dag 传递给 TriggerDagRunOperator 来触发多个 dags 是否可以仅
  • C++ 可变参数模板 AND 和 OR

    可以使用C 11可变参数模板来完成吗 in template
  • 修改jar文件

    我有一个 jar 文件 在 html 文件中用作小程序 我想修改 jar 文件的内容并重建 jar 文件 以便 html 可以与新的 jar 文件一起正常工作 我怎样才能做到这一点 我已经尝试使用 7zip 解压缩 并修改了源代码并创建了新
  • 如何在postgis中创建一个以米为单位的圆?

    我想问一下如何创建一个圆radius 4km 我已经尝试过ST Buffer功能 但它创造了一个更大的圆圈 我通过将其多边形插入新的 kml 文件来查看创建的圆 这就是我正在尝试的 INSERT INTO camera geom circl
  • 为什么我要删除 build/ 目录?

    Flutter Dart Android 新手 在控制台中刚刚做了 C Users lordnull gt flutter help clean Delete the build directory 只是想知道为什么我们要删除项目的构建目录
  • “传递结果失败” - onActivityForResult

    我有一个LoginActivity 用户登录 基本上都是自己的Activity它的主题就像一个对话框 看起来像一个对话框 它出现在一个SherlockFragmentActivity 我想要的是 如果有成功登录 应该有两个FragmentT
  • 将多个 .yml 文件传递​​给 docker-compose

    这里是 Docker 菜鸟 我的 docker 文件夹中有两个文件 docker compose build yml 和 docker compose up yml 以下是两个文件的内容 docker compose build yml v
  • 龙卷风.gen.engine 与tornado.gen.coroutine 的区别

    走过龙卷风 gen文档有人可以帮助我理解tornado gen coroutine和tornado gen engine之间的确切区别 作为龙卷风文档gen engine says 该装饰器类似于协程 但它不返回 Future 和回调参数没
  • 随机路径生成算法

    我想生成一个从矩阵顶部到底部的随机路径 FIDDLE 要求 路径可以蜿蜒 但必须从第一行连接到最后一行 最终 我希望每个路径片段的颜色是随机的 但现在它可以是统一的 我在下面仅使用红色进行了测试 从上到下连接的路径是随机生成的 路径片段显然
  • 使用 Jackson 映射时将默认值设置为空字段

    我正在尝试使用 Jackson 将一些 JSON 对象映射到 Java 对象 JSON 对象中的一些字段是强制性的 我可以用 NotNull 有些是可选的 与 Jackson 映射后 JSON 对象中未设置的所有字段在 Java 中都将为空
  • Visual Studio 2008 的 XML 架构设计器

    VS 2005确实包含 XSD 文件的设计器 在哪里可以找到 VS 2008 的版本 我只找到了预览版VS 2008 测试版 2 我建议不要使用 XML 模式的数据集编辑器 微软从 VS 2005 开始停止支持模式设计器是有原因的 我们对
  • 如何使用 PowerMock 和 Mockito 模拟枚举类的实例?

    我尝试遵循这个非常相似的问题的答案中提供的示例 但它对我不起作用 我收到以下错误消息 java lang IllegalArgumentException Cannot subclass final class class com mypr
  • python - setup.py sdist bdist_wheel

    我决定创建一个名为 NsmPY 的小模块 一旦我完成了模块背后的代码 可在 GitHub 上找到 我就开始尝试将这个新模块上传到 PyPi 但是 当我运行必要的命令时python3 setup py sdist bdist wheel 程序
  • 无效更新:节中的行数无效

    我正在使用一个项目Microsoft Azure services 在删除行时我收到此错误 Terminating app due to uncaught exception NSInternalInconsistencyException
  • 如何触发MathJax?

    包括我MathJax与脚本 这会自动用格式化标签替换所有数学代码 我怎样才能触发MathJax仅通过 JavaScript 单击 而不是在加载时单击 我怎么知道MathJax将格式化的元素放在页面末尾而不是替换原始代码 1 如何仅通过 ja
  • 为什么 。 PHP $_GET 数组中的 (点) 和空格更改为 _ (下划线)? [关闭]

    Closed 这个问题是无关 目前不接受答案 In PHP 文档我发现以下部分 变量名中的点和空格将转换为下划线 例如
  • 谁是 GWLP_USERDATA 单元的所有者?

    众所周知GWLP USERDATA可用于将一些指针大小数据与指定窗口相关联 但谁有权利这样做呢 显然 如果两段代码独立执行此操作 其中一段代码会覆盖另一段代码 那么必须只有一个所有者 但必须明确确定一个一般规则 谁是所有者GWLP USER
  • 指向链表的指针什么时候会改变实际的链表?

    我有一个单链表 L 并创建一个指向该列表 P 的指针 似乎有时修改 P 会更改实际列表 而其他时候修改 P 对实际列表 L 没有任何作用 只会更改 P 所指向的内容到 假设我创建一个指向 L 的指针 P L 在 python 中 执行类似