0

下面是打印链表的代码

 def printlinkedlist(root):
  if root==None:
    return
  print(root.data)
  printlinkedlist(root.next)

假设链表包含

1-2-3-4-5-6-7-8

通过调用 printlinkedlist(root) --------->它给出 put as----->1-2-3-4-5-6-7-8

现在,我调用另一个函数

def linkedlist2(root):
  if root==None:
    return
  print(root.data)
  if root.next==None:
    root.data=50
    return
  linkedlist2(root.next)

这基本上使最后一个元素值为50。当我调用printlinkedlist(root)它产生的函数时1-2-3-4-5-6-7-50

疑惑一:由于原始根中的值改变了,根是值传递还是引用传递?

如果是这样,希望它通过引用传递

def linkedlist3(root):
  if root==None:
    return
  print(root.data)
  if root.next==None:
    root=None
    return
  linkedlist3(root.next)

这基本上使最后一个节点为None.ie,当调用linkedlist(root)时1-2-3-4-5-6-7-50输出应该像(因为50被设为None)。1-2-3-4-5-6-7这不是发生的事情。它产生相同的先前输出,即1-2-3-4-5-6-7-50.

有人可以解释为什么没有产生我想要的输出,以及它是按值调用还是按引用调用???。

4

1 回答 1

1

它是按值传递的引用(即类似于在 C 中传递指针)。

当您设置时,root.next您正在更改所引用next节点的值root,因此列表在该节点处发生更改。当您设置root自己时,您只是在修改传入的引用,而不是它所引用的基础值,因此列表不受影响。

如果要删除链表的最后一个节点,则需要将next倒数第二个节点的 设置为None。就像是:

def pop_last(root):
    if root is None or root.next is None:
        raise IndexError("can't pop from list with len < 2")
    if root.next.next is None:
        val = root.next.data
        root.next = None
        return val
    return pop_last(root.next)
于 2021-06-07T14:39:39.303 回答