【问题标题】:Iterative solution to reverse linked list in sets of kk集合中反向链表的迭代解
【发布时间】:2020-02-06 04:32:48
【问题描述】:

给定一个单链表,我试图在整个列表中一次反转 k 个节点。 所以,如果 k = 2,1 -> 2 -> 3 -> 4 -> 5 -> 6 将变成 2 -> 1 -> 4 -> 3 -> 6 - > 5。假设 k 始终是列表长度的一个因子(列表长度可被 k 整除)。

我正在尝试使用迭代方法而不是递归方法来解决这个问题。我正在尝试将列表解析为 k 个节点的集合,并将它们分别反转到列表的末尾。这是我的代码

def reverseList(A, B): # param A : head node of linked list, param B : integer, return the head node in the list
    if B < 2:
        return A
    dummy = ListNode('dummy')
    dummy.next = A
    prev, behind = dummy, A
    while behind:
        ahead = behind
        for i in range(B-1):
            ahead = ahead.next
        new_behind = reverse_list(behind, ahead)
        prev.next = ahead
        behind.next = new_behind
        behind = behind.next
    return dummy.next

reverse_list函数将k个集合的开始到结束节点的列表反转,返回新的k个节点集合开始处的节点(新的开始节点)

def reverse_list(start, end):
    prev, curr = None, start
    while prev is not end:
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    return curr

ListNode类的定义

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

当给出值 A = [ 6 -> 10 -> 0 -> 3 -> 4 -> 8 ] 和 B = 3 时,输出为 8 -> 4 -> 3。我到底错过了什么或俯瞰?非常感谢任何帮助。

【问题讨论】:

    标签: python linked-list singly-linked-list


    【解决方案1】:

    我已经弄清楚我一直在犯的错误。我在更新 'behind' 指针时没有更新 'prev' 指针。应该是的

    prev = 后面

    在得到后面和前面的指针后,这应该是 reverseList 函数中 while 循环内的代码块

    new_behind = reverse_list(behind, ahead)
    prev.next = ahead
    behind.next = new_behind
    prev = behind
    behind = behind.next
    

    【讨论】:

      【解决方案2】:

      每次迭代,应该先将当前节点的next节点指向next节点的next节点,再将next节点的next节点指向head节点,再将head节点指向next节点, 完成给定节点数的反转。然后将当前节点分配为新的head,重复上述,直到head的下一个节点为None

      def reverseList(A, B):
          head = A
          while head.next:
              node = head.next
              for _ in range(B - 1):
                  next_node = node.next
                  if next_node:
                      node.next = next_node.next
                      next_node.next = head.next
                      head.next = next_node
              head = node
          return A
      

      演示:https://repl.it/@blhsing/ElatedSurefootedFilesize

      【讨论】:

        猜你喜欢
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 2016-06-20
        • 2016-07-09
        • 1970-01-01
        • 2013-10-10
        • 2012-10-08
        • 2019-01-20
        相关资源
        最近更新 更多