首页 > 解决方案 > 我无法理解下面的 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;
}    


标签: c#

解决方案


您可以使用调试器或带笔的纸逐步执行逻辑步骤。

这看起来像一个链表。每个节点指向下一个,最后一个音符指向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;

现在,两者ptrtemp指向同一个节点

                     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,返回新的头部

此方法反转链表的顺序并返回头部。


推荐阅读