【问题标题】:Why iteration linking works that way in Linked List为什么迭代链接在链接列表中以这种方式工作
【发布时间】:2022-01-09 07:11:09
【问题描述】:

我无法完全理解 Leetcode 上第 19 题的解决方案。

所以当我们创建快速和慢速 - 我们创建了头部链接?我可以判断是的。但是然后我们快速迭代 - 为什么它不改变头部?我的意思是在我们用 fast.next 替换 fast 的每一步?所以不知何故它不会影响头部和缓慢。

然后我们将 slow.next 替换为 slow.next.next,它确实会影响 head。

您能否描述一下它如何在第一部分不替换任何内容并在第二部分替换。

var removeNthFromEnd = function(head, n) {
    let fast = head, slow = head

    for (let i = 0; i < n; i++) fast = fast.next // why it doesn’t change head and slow?

    if (!fast) return head.next

    while (fast.next) fast = fast.next, slow = slow.next
    slow.next = slow.next.next // why it change head?
    return head
 };

【问题讨论】:

  • 如果只分配给fast,为什么会影响headslow?它们是不同的变量。
  • 下面的答案为我解决了这个问题。之前没看懂。

标签: javascript algorithm linked-list singly-linked-list


【解决方案1】:

给一个变量赋值不会改变一个对象。

给一个属性赋值会改变你正在设置属性的对象。

在您的情况下,fast 是一个变量,因此为它分配一些东西,例如fast.next,永远不会改变一个对象。它只是改变了fast 所引用的内容。

另一方面,slow.next 是一个属性。为该属性分配一些东西会改变slow 引用的对象。

让我们想象一下fast = fast.next 做了什么。假设fast 是 3 个列表中的第二个节点:

之前:

 head            fast 
  ↓               ↓
┌───────────┐   ┌───────────┐   ┌───────────┐
│ data: B   │   │ data: G   │   │ data: D   │
│ next: ──────> │ next: ──────> │ next: null│
└───────────┘   └───────────┘   └───────────┘

之后:

 head                            fast 
  ↓                               ↓
┌───────────┐   ┌───────────┐   ┌───────────┐
│ data: B   │   │ data: G   │   │ data: D   │
│ next: ──────> │ next: ──────> │ next: null│
└───────────┘   └───────────┘   └───────────┘

现在看看slow.next = slow.next.next 做了什么。假设slow 引用了第一个节点:

之前:

 slow
 head
  ↓  
┌───────────┐   ┌───────────┐   ┌───────────┐
│ data: B   │   │ data: G   │   │ data: D   │
│ next: ──────> │ next: ──────> │ next: null│
└───────────┘   └───────────┘   └───────────┘

之后:

 slow
 head
  ↓  
┌───────────┐   ┌───────────┐   ┌───────────┐
│ data: B   │   │ data: G   │   │ data: D   │
│ next: ─────┐  │ next: ──────> │ next: null│
└───────────┘│  └───────────┘┌> └───────────┘
             └───────────────┘ 

【讨论】:

  • 现在我明白了。我看到你对同一个问题的回答,但对我来说并不完全清楚。现在它是。非常感谢!
【解决方案2】:

当您执行fast = fast.next 时,您正在更改引用变量。 fast 现在指向列表中的下一项。

当您执行slow.next = slow.next.next 时,您正在更改slow 指向的对象的属性。

事实上,在这个例子中,head 永远不会改变,并且总是指向列表中的第一个元素。

【讨论】:

  • 感谢您的解释。现在对我来说很清楚了。
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多