c# - 我无法理解下面的 c# 代码片段
问题描述
我只有这部分代码。我无法理解是“下一个” ptr 的另一种方法还是 random.next 方法。只是想知道这是否是专家使用的常见代码片段。
Node mystery(Node ptr) {
Node temp;
Node previous = null;
while (ptr != null) {
temp = ptr.next;
ptr.next = previous;
previous = ptr;
ptr = temp;
}
return previous;
}
解决方案
您可以使用调试器或带笔的纸逐步执行逻辑步骤。
这看起来像一个链表。每个节点指向下一个,最后一个音符指向null
head tail
+---+ +---+ +---+
|"A"| next |"B"| next |"C"| next
| |------>| |------>| |------> null
+---+ +---+ +---+
while (ptr != null) {
将循环直到当前节点null
while 范围内的代码是典型的交换。让我们逐步执行它,考虑ptr
包含 的节点"A"
,如上
temp = ptr.next;
现在,temp
正在指向下一个节点。
ptr
|
v
+---+ +---+ +---+
|"A"| next |"B"| next |"C"| next
| |------>| |------>| |------> null
+---+ +---+ +---+
^
|
temp
ptr.next = previous;
现在,ptr.next
是指向previous
哪个被初始化为null。ptr
现在已从列表中取消链接
ptr
|
v
+---+ | +---+ +---+
|"A"| next | |"B"| next |"C"| next
| |------> null | | |------>| |------> null
+---+ | +---+ +---+
| ^
| |
temp
previous = ptr;
ptr
和都previous
指向同一个节点
ptr
|
v
+---+ | +---+ +---+
|"A"| next | |"B"| next |"C"| next
| |------> null | | |------>| |------> null
+---+ | +---+ +---+
^ | ^
| | |
previous temp
ptr = temp;
现在,两者ptr
都temp
指向同一个节点
ptr
|
v
+---+ | +---+ +---+
|"A"| next | |"B"| next |"C"| next
| |------> null | | |------>| |------> null
+---+ | +---+ +---+
^ | ^
| | |
previous temp
既然ptr != null
是真的,循环继续:
temp = ptr.next;
ptr
|
v
+---+ | +---+ +---+
|"A"| next | |"B"| next |"C"| next
| |------> null | | |------>| |------> null
+---+ | +---+ +---+
^ | ^
| | |
previous temp
ptr.next = previous;
现在,当前节点的下一项是之前保存的("A"
节点):
ptr
|
v
+---+ +---+ | +---+
|"B"| next |"A"| next | |"C"| next
| |------> | |------> null | | |------> null
+---+ +---+ | +---+
^ | ^
| |
previous temp
previous = ptr;
ptr
|
v
+---+ +---+ | +---+
|"B"| next |"A"| next | |"C"| next
| |------> | |------> null | | |------> null
+---+ +---+ | +---+
^ | ^
| |
previous temp
ptr = temp;
ptr
|
v
+---+ +---+ | +---+
|"B"| next |"A"| next | |"C"| next
| |------> | |------> null | | |------> null
+---+ +---+ | +---+
^ | ^
| |
previous temp
由于ptr != null
为真,循环继续并应用相同的逻辑:
temp = ptr.next;
ptr
|
v
+---+ +---+ | +---+
|"B"| next |"A"| next | |"C"| next
| |------> | |------> null | | |------> null
+---+ +---+ ^ | +---+ ^
^ | | |
| | |
previous +-----------------temp
ptr.next = previous;
ptr
|
v
+---+ +---+ +---+
|"C"| next |"B"| next |"A"| next
| |------> | |------> | |------> null
+---+ +---+ +---+ ^
^ |
| |
previous temp
previous = ptr;
ptr
|
v
+---+ +---+ +---+
|"C"| next |"B"| next |"A"| next
| |------> | |------> | |------> null
+---+ +---+ +---+ ^
^ |
| |
previous temp
ptr = temp;
ptr
|
+---+ +---+ +---+ |
|"C"| next |"B"| next |"A"| next v
| |------> | |------> | |------> null
+---+ +---+ +---+ ^
^ |
| |
previous temp
现在,while (ptr != null)
是假的。循环结束previous
,返回新的头部。
此方法反转链表的顺序并返回头部。
推荐阅读
- c++ - 如何使用形态学操作去除不需要的噪音?
- django - 在 django 通用视图中访问 self.request.user.profile
- keras - 将 Embedding 层参数转换为 Lambda 层
- c - C程序通过scanf
- python - 查找字典列表中的最大值并返回键
- typescript - 错误 TS2339:只读类型上不存在属性
- sql - 从应用脚本查询计算机上的数据库
- javascript - 特定的 React 模型有时不会加载,需要重新渲染
- javascript - 尝试在 React 中实现脚本
- ruby-on-rails - 我可以将 PGOPTIONS 环境变量用于 ruby on rails rails postgresql 会话吗?