【问题标题】:Reverse every K-element Sub-List反转每个 K 元素子列表
【发布时间】:2021-10-02 20:44:44
【问题描述】:

我无法将之前的列表与当前的反向列表连接起来。问题如下……

给定一个 LinkedList 的头部和一个数字“k”,从头部开始反转每个“k”大小的子列表。如果最终你得到一个包含少于“k”个元素的子列表,也可以反转它。

我只是想我会保留一个counter,它总是会更新以反转从列表的head 开始的最大 k 大小的 sub_list。找到end 应该在的位置,并让start 指向列表的开头。

为了反转任何大小小于或等于 k ​​的列表,我只需检查 end is None 是否。

列表的start 成为列表的末尾,因为end 实际上指向k + 1 节点,所以第一次迭代将k 个节点的第一次反转与列表的其余部分通过start.next = end 连接起来,其中start 指向反向列表的最后一个节点,end 指向另一个列表的开头。

我知道我的问题在于,在第二次迭代期间,当列表反转时,我失去了对之前列表的引用(我们可以将其视为前半部分)。例如,对于我的第一次迭代,列表

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8, k = 3

成为,

3 -> 2 -> 1 -> 4 -> 5 -> 6 -> 7 -> 8

但在第二次迭代之后,我不再拥有前 3 个节点的 sub_list

from __future__ import print_function


class Node:
  def __init__(self, value, next=None):
    self.value = value
    self.next = next

  def print_list(self):
    temp = self
    while temp is not None:
      print(temp.value, end=" ")
      temp = temp.next
    print()


def reverse_every_k_elements(head, k):
  start, end = head, head
  previous = None

  while end is not None:
    counter = k

    while end is not None and counter > 0:
      end = end.next
      counter -= 1
    
    sub_list = reverse(start, end)
    start.next = end
    start = end
    
    if previous:
      previous.next = end
    else:
      previous = end

  


def reverse(head, stop_node):
  previous = None

  while head is not stop_node:
    _next = head.next
    head.next = previous
    previous = head
    head = _next

  return previous


def main():
  head = Node(1)
  head.next = Node(2)
  head.next.next = Node(3)
  head.next.next.next = Node(4)
  head.next.next.next.next = Node(5)
  head.next.next.next.next.next = Node(6)
  head.next.next.next.next.next.next = Node(7)
  head.next.next.next.next.next.next.next = Node(8)

  print("Nodes of original LinkedList are: ", end='')
  head.print_list()
  result = reverse_every_k_elements(head, 3)
  print("Nodes of reversed LinkedList are: ", end='')
  result.print_list()


main()

我不知道从这里去哪里。

【问题讨论】:

    标签: python reverse singly-linked-list sublist


    【解决方案1】:

    由于end 是节点之后 反转的部分,或者--否则放-- 列表其余部分的第一个节点仍待处理,你不应该有:

    previous.next = end
    

    被反转的部分现在具有sub_list 引用的第一个节点,因此:

    previous.next = sub_list
    

    这是除反转之外唯一需要更新的next链接,因此无需此更新:

    start.next = end
    

    previousNone 时,我们应该设置head 而不是previous.next

    head = sub_list
    

    这些是最重要的改变。通过其他一些调整,我们得到了这个:

    def reverse_every_k_elements(head, k):
      start, end = None, head
    
      while end is not None:
        previous = start 
        start = end
    
        counter = k
        while end is not None and counter > 0:
          end = end.next
          counter -= 1
        
        sub_list = reverse(start, end)
        
        # Here the magic (of linking the pieces) happens:
        if previous:
          previous.next = sub_list
        else:
          head = sub_list
    
      # Need to return the head...
      return head
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多