首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么prev,curr,下一个反向链表问题的迭代解是必需的?

为什么prev,curr,下一个反向链表问题的迭代解是必需的?
EN

Stack Overflow用户
提问于 2022-07-16 15:36:23
回答 2查看 57关注 0票数 0

链表的经典输入问题:给定单链表的头,反转列表,并返回反向列表。

例如,输入: head = 1,2,3,4,5输出: 5,4,3,2,1

在python中,一个非常典型的解决方案是

代码语言:javascript
运行
复制
def reverseList(self, head):
    prev = None
    curr = head

    while curr:
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    
    return prev

在我看来,以下几点也会“起作用”

代码语言:javascript
运行
复制
def reverseList(self, head):
        curr=head
        while curr.next:
            tmp=curr
            curr=curr.next
            curr.next=tmp
        
        return curr

其中,我只使用2(tmp,curr)而不是3(prev,curr,next)‘变量’(如果描述它们的名字不对,请纠正我)。我知道我没有考虑到链表的结尾不应该指向任何一个。然而,它不应该给出类似于建议的解决方案的结果吗?但是,我得到了第二个运行时错误吗?哪里出问题了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-16 17:57:45

让我们看看在第二个代码版本中,值1、2和3的链接列表会发生什么。

在循环开始之前,我们有这样的情况:

代码语言:javascript
运行
复制
 head, 
 curr
  ↓        
┌──────────┐   ┌──────────┐   ┌──────────┐ 
│ data: 1  │   │ data: 2  │   │ data: 3  │
│ next: ─────► │ next: ─────► │ next:None│
└──────────┘   └──────────┘   └──────────┘

在第一次迭代之后,更新了一个next引用:

代码语言:javascript
运行
复制
 head           curr
  ↓              ↓
┌──────────┐   ┌──────────┐   ┌──────────┐ 
│ data: 1  │   │ data: 2  │   │ data: 3  │
│ next: ─────► │ next: ─┐ │   │ next:None│
└──────────┘   └────────│─┘   └──────────┘
  ↑      ▲              │
 tmp     └──────────────┘

这看起来已经不对了,因为我们已经失去了对第三个节点的引用,第三个节点已经无法到达。因此,一旦更新了next属性,所有完成反转的希望都会丢失。

但是还要注意在第二次迭代中,curr是如何在列表中返回的,因为它遵循更新的next引用。这不是应该发生的事。curr应该继续前进。然后,它将head的next属性设置为第二个节点,但是已经是这样了(这里没有反转!)因此,curr将无止境地绕着圈走。

替代方案

与第一个工作版本相比,在执行元组赋值时,可以少使用一个变量:

代码语言:javascript
运行
复制
    def reverseList(self, head):
        curr = head
        prev = None
        while curr:
            curr.next, prev, curr = prev, curr, curr.next
        return prev

要将其简化为一个变量(head),可以使用递归解决方案:

代码语言:javascript
运行
复制
    def reverseList(self, head):
        if not head or not head.next:
            return head
        head.next.next, head.next, head = head, None, self.reverseList(head.next)
        return head
票数 0
EN

Stack Overflow用户

发布于 2022-07-16 16:04:08

代码语言:javascript
运行
复制
list = [1,2,3,4,5]
list.reverse()
print(list) // [5, 4, 3, 2, 1]
代码语言:javascript
运行
复制
def reverseMyList(list):
    listReversed = []
    for i in list:
            listReversed.insert(0, i)
    return listReversed
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73005493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档