【问题标题】:Not able to assign head after reversing a linked list iteratively in Python在Python中迭代地反转链表后无法分配头部
【发布时间】:2021-05-08 18:01:30
【问题描述】:

我是数据结构的新手,我试图在 Python 中迭代地反转链表。下面是代码。

class Node:

    def __init__(self, initval=None,next_val=None):
        self.value = initval
        self.next = next_val


    def isempty(self):
        return self.value == None

    def append(self, val):
        if self.isempty():
            self.value=val

        elif self.next==None:
            self.next=Node(val)
            
        else:
            self.next.append(val)
        return
    def insert(self, val):
        if self.isempty():
            self.value = val
            return

        newnode = Node(val)

        self.value, newnode.value = newnode.value, self.value
        self.next, newnode.next = newnode, self.next
        return
    def delete(self, val):
        if self.isempty():
            return

        if self.value == val:
            if self.next ==None:
                self.value=None

            else:
                self.value=self.next.value
                self.next=self.next.next
                return
        else:
            if self.next !=None:
                self.next.delete(val)
                if self.next.value==None:
                    self.next=None
        return
 
    def reverse(self):
        prev = None
        current = self

        while current:
            next=current.next
            current.next=prev
            prev=current
            current=next
            
        #print(prev)
        return prev
        

##    def __iter__(self):
##        node = self
##        while node !=None:
##            yield node.value
##            node=node.next
    def __str__(self):
        llist=[]
        if self.value==None:
            return str(llist)
        tmp =self
        llist.append(tmp.value)
        while tmp.next !=None:
            tmp = tmp.next
            llist.append(tmp.value)
        return str(llist)
        
def main():

    l=Node()

    for i in [2,7,6,1,4,8,9]:
        l.append(i)

    print(l,id(l))

    print(l.reverse())
    
    print(l,id(l))



if __name__ == "__main__": main()

目前这个程序只返回反向列表的第一个元素。这是输出。

[2, 7, 6, 1, 4, 8, 9] 47566384
[9, 8, 4, 1, 6, 7, 2]
[2] 47566384

我所期待的是:

[2, 7, 6, 1, 4, 8, 9] 47566384
[9, 8, 4, 1, 6, 7, 2]
[9, 8, 4, 1, 6, 7, 2] 47566384

我尝试过,在 while 循环外的 reverse 函数的末尾分配 self.value = prev。然后我在如下列表中获取一个节点对象:

[2, 7, 6, 1, 4, 8, 9] 53661168
None
[<__main__.Node object at 0x03597F10>] 53661168

如何正确显示此 Node 对象?谢谢。

【问题讨论】:

  • 这就是为什么通常使用像 LinkedList 这样的包装结构的原因之一,这样您就可以跟踪头部并在完成反向操作后重新分配它。

标签: python data-structures linked-list reverse


【解决方案1】:

您正试图将链表反转到位。

在您的代码中,l 最初是值为 2 的节点。您成功反转了列表。

但是调用l.reverse()之后,l仍然指向值为2的节点。

你不能让l从它自己的方法中引用别的东西。

Is it safe to replace a self object by another object of the same type in a method?

实际上甚至可以做类似的事情:

    def reverse(self):
        prev = None
        current = self

        while current:
            next=current.next
            current.next=prev
            prev=current
            current=next
            
        self.val = prev.val
        self.next = prev.next
        #print(prev)
        return prev

不起作用,因为现在您已经在列表 7->9 中创建了一个循环,因为 7 最初指向自己 self.__dict__.update(prev.__dict__) 不会因为同样的原因而工作。

简单地分配self = prev 也不起作用,因为self 只是本地的。

所以你最好的选择是简单地将 l 分配给 l.reverse()

l = l.reverse() 这样l 现在实际上是反向列表的第一个节点。

【讨论】:

  • 感谢 Vikash,找到了一些将 current 分配给 self.head 的解决方案,如果它只是在 'head' 的值,我们如何迭代当前 var,我在这里缺少什么?你可以在下面找到。 ``` def reverse(self): prev = None current = self.head while(current is not None): next = current.next current.next = prev prev = current current = next self.head = prev ```
  • 这会在调用 reverse 之前和之后为节点“l”生成相同的 id。
  • 如果你为 Node 使用一个名为 LinkedList 的包装数据结构,然后在链表中实现反向,那么将保留 yes id。
猜你喜欢
  • 2012-10-08
  • 2021-06-27
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
相关资源
最近更新 更多