鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ python鏈表反轉(zhuǎn)引發(fā)的問題

python鏈表反轉(zhuǎn)引發(fā)的問題

先附上代碼
#節(jié)點類
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

    #只加一個節(jié)點
    def append(self,dataOrNode):
        #item得是一個Node,加的如果只是一個數(shù),得變成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
    #刪除一個節(jié)點
    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
    #鏈表反轉(zhuǎn)
    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個元素,然后反轉(zhuǎn)

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反轉(zhuǎn)正確,之前的head重新賦值了現(xiàn)在的pre(之前head指向的地址變成了現(xiàn)在pre的地址),我覺得很對,以前mychain.head是123這個地址,現(xiàn)在的mychain.head是321這個地址,那應(yīng)該是能正常輸出3-2-1,可是結(jié)果就是只有1,不明白
clipboard.png

輔助代碼:

head = {'a':1,'b':2}
def change(head):
    head['k'] = 2
change(head)
print(head)
結(jié)果:{'a': 1, 'b': 2, 'k': 2},因為是引用傳遞,head作為參數(shù)傳入change函數(shù),出來,內(nèi)容改變,很對,但是傳reverse函數(shù),沒有預(yù)想的效果,不明白??

題目描述

題目來源及自己的思路

相關(guān)代碼

// 請把代碼文本粘貼到下方(請勿用圖片代替代碼)

你期待的結(jié)果是什么?實際看到的錯誤信息又是什么?

回答
編輯回答
抱緊我

因為python里的是傳值操作,你在reverse里的操作并沒有改變Chain這個類的head屬性啊,把最后一句改成self.head = pre試試。不過按你的代碼應(yīng)該是輸出123,而不單單1,這個是有點奇怪。

2017年5月5日 06:34
編輯回答
紓惘

循環(huán)體里改變循環(huán)變量這種做法是極不推薦的。

2017年2月22日 12:54