递归调用中的 Javascript 按引用传递问题

Javascript passing by reference issue in recursive calls

提问人:Charli Xbox 提问时间:4/14/2021 更新时间:4/14/2021 访问量:223

问:

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 如何同时更改我的对象,因此链表链接不会保留在头部。我能做些什么来使我在修改 ?headreversedLL.next = new Node(ll.data);headreversedLL

JavaScript 调试 递归 按引用 值传递

评论

0赞 Pointy 4/14/2021
reversedLL是与head
0赞 Pointy 4/14/2021
哦,在函数中更新也不会在调用环境中更改它。JavaScript 没有传递引用。reversedLLreverse
0赞 Charli Xbox 4/14/2021
是的,但出于某种原因,在执行此操作后,应指向最后一个节点,并应指向第一个节点。而是指向与 相同的节点。reversedLLheadheadreversedLL
0赞 Pointy 4/14/2021
同样,在语句末尾的赋值会更改上下文中的局部变量。它对调用上下文中的变量没有影响。reversedLLifreversedLLreversereversedLL
1赞 Charli Xbox 4/14/2021
我想我弄清楚了它失败的原因,对象没有保留在调用堆栈中,所以我不得不在递归调用中返回它reversedLLreversedLL = reverse(ll.next, reversedLL);

答:

1赞 Mulan 4/14/2021 #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}}}

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

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}}}