给定一个单向链表,我正在尝试一次反转 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。我到底错过或忽略了什么?任何帮助将不胜感激。
对于每次迭代,应将当前节点的下一个节点指向下一个节点的下一个节点,然后将下一个节点的下一个节点指向头节点,然后将头节点指向下一个节点,以完成给定节点数的反转。然后将当前节点指定为新头,重复上述操作,直到头的下一个节点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
我已经弄清楚了我一直犯的错误。我在更新"后面"指针时没有更新"上一个"指针。它应该是
上一页 = 后面
在获取后面和前面的指针后,这应该是 reverseList 函数中 while 循环中的代码块
new_behind = reverse_list(behind, ahead)
prev.next = ahead
behind.next = new_behind
prev = behind
behind = behind.next