【问题标题】:Javascript passing by reference issue in recursive callsJavascript 在递归调用中通过引用传递问题
【发布时间】:2021-07-09 02:12:20
【问题描述】:
const reverseLinkedList = (ll) => {
  const head = new Node();
  const reversedLL = head;
  
  reverse(ll, reversedLL);
  return head.next;
}

const reverse = (ll, reversedLL) => {
  if (ll) {
    reverse(ll.next, reversedLL);
    reversedLL.next = new Node(ll.data);
    reversedLL = reversedLL.next;
  } 
}

我正在做反向链表问题,但它没有正常运行,因为我相信这是因为 javascript 如何同时更改我的head 对象和reversedLL.next = new Node(ll.data);,所以链表链接不会持续存在头部。有什么办法可以让head 在我修改reversedLL 时不会改变?

【问题讨论】:

  • reversedLLhead 是同一个对象
  • 哦,在reverse 函数中更新reversedLL 也不会在调用环境中改变它。 JavaScript 没有传递引用。
  • 是的,但是由于某种原因,在此执行之后,reversedLL 应该指向最后一个节点,head 应该指向第一个节点。但是head 指向与reversedLL 相同的节点。
  • 同样,在if 语句末尾对reversedLL 的赋值改变了reverse 上下文中的local 变量reversedLL。它对调用上下文中的reversedLL 变量没有影响。
  • 我想我知道为什么它失败了,reversedLL 对象没有保留在调用堆栈中,所以我不得不在递归调用中返回它reversedLL = reverse(ll.next, reversedLL);

标签: javascript debugging recursion pass-by-reference pass-by-value


【解决方案1】:

我假设您需要 reverse 列表 -

function reverse(ll)
{ if (ll == null) return
  let p = null
  let q = ll
  while (q)
  { p = {data: q.data, next: p}
    q = q.next
  }
  ll.data = p.data
  ll.next = p.next
}

const mylist = {data: 1, next: {data: 2, next: {data: 3, next: null}}}

reverse(mylist)

console.log(JSON.stringify(mylist))
{data: 3, next: {data: 2, next: {data: 1, next: null}}}

但是你用 recursion 标记了这个问题,所以也许你想创建一个反向副本?

function reverse(ll, p = null)
{ if (ll == null)
    return p
  else
    return reverse(ll.next, {data: ll.data, next: p})
}

const mylist = {data: 1, next: {data: 2, next: {data: 3, next: null}}}

const revList = reverse(mylist)

console.log(JSON.stringify(revList))
console.log(JSON.stringify(mylist))
{data: 3, next: {data: 2, next: {data: 1, next: null}}}
{data: 1, next: {data: 2, next: {data: 3, next: null}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 2012-10-10
    • 2019-01-28
    • 2015-08-09
    • 2011-03-14
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多