python链表反转引发的问题

先附上代码
#节点类
class Node(object):
    def __init__(self,data,nNext = None):
        self.data = data
        self.next = nNext
#链表类
class Chain(object):
    def __init__(self):
        self.head = None
        self.length = 0

    #只加一个节点
    def append(self,dataOrNode):
        #item得是一个Node,加的如果只是一个数,得变成Node
        if isinstance(dataOrNode,Node):
            item = dataOrNode
        else:
            item = Node(dataOrNode)
        #头为空
        if not self.head:
            self.head = item
            self.length += 1
        else:
            node = self.head
            #找到最后一个点把它连起来
            while node.next:
                node = node.next
            #如果item是一个链子如何解决
            node.next = item
            self.length += 1
    #删除一个节点
    def delete(self,index):
        if index<0 or index>=self.length:
            return None

        current = self.head
        pre    = None
        temp_index = 0
        while current.next:
            if temp_index == index:
                if not pre:
                    self.head = current.next
                else:
                    pre.next = current.next
                self.length -= 1
                return
            pre = current
            current = current.next
            temp_index += 1
    #链表反转
    def reverse(self,head):
        cur = head
        pre = None
        while cur is not None:
            #print(head)
            tmp = cur.next
            cur.next = pre
            pre = cur
            #print(pre.data)
            cur = tmp
        head = pre

问题:链表添加3个元素,然后反转

mychain = Chain()
mychain.append(1)
mychain.append(2)
mychain.append(3)
mychain.reverse(mychain.head)
依次输出链表的每个值
node2 = mychain.head
while node2 is not None:
    print(node2.data)
    node2 = node2.next
只输出一个1。

pre反转正确,之前的head重新赋值了现在的pre(之前head指向的地址变成了现在pre的地址),我觉得很对,以前mychain.head是123这个地址,现在的mychain.head是321这个地址,那应该是能正常输出3-2-1,可是结果就是只有1,不明白
clipboard.png

辅助代码:

head = {'a':1,'b':2}
def change(head):
    head['k'] = 2
change(head)
print(head)
结果:{'a': 1, 'b': 2, 'k': 2},因为是引用传递,head作为参数传入change函数,出来,内容改变,很对,但是传reverse函数,没有预想的效果,不明白??

题目描述

题目来源及自己的思路

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 2.8k
2 个回答

因为python里的是传值操作,你在reverse里的操作并没有改变Chain这个类的head属性啊,把最后一句改成self.head = pre试试。不过按你的代码应该是输出123,而不单单1,这个是有点奇怪。

新手上路,请多包涵

循环体里改变循环变量这种做法是极不推荐的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题