Python中链表的K个一组翻转链表操作

2023-04-11 00:00:00 操作 链表 翻转

链表是一种常见的数据结构,Python中可以使用类来模拟链表。链表的K个一组翻转操作指的是将一个链表中每K个节点作为一组,分别翻转各组中的节点。

以下是Python中链表的K个一组翻转操作的实现代码:

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

def reverseKGroup(head: ListNode, k: int) -> ListNode:
    dummy = ListNode(0)
    dummy.next = head
    prev = dummy
    while prev:
        p = prev.next
        for i in range(k):
            if not p: # 若不足k个,则不操作直接返回
                return dummy.next
            p = p.next
        pre, cur = prev.next, prev.next.next
        for i in range(1, k):
            pre.next = cur.next
            cur.next = prev.next
            prev.next = cur
            cur = pre.next
        prev = pre
    return dummy.next

该代码中,首先定义了链表节点类ListNode,并在reverseKGroup函数中定义了一个虚拟节点dummy,用于方便链表的翻转操作。代码中使用了双指针法,每次翻转一个组的节点。

具体而言,每次首先检查是否有足够的节点进行下一轮翻转操作,若不足K个节点则直接返回。然后使用pre、cur两个指针分别指向待翻转组的第一个节点以及第二个节点。在循环中,对于每个节点,都将它挪到pre的后面,直到整个组的节点被翻转完毕。

最后返回虚拟节点dummy的next指针,即为翻转后的链表。

以下是一个使用字符串作为范例的Python代码演示:

s = "pidancode.com"
head = ListNode(s[0])
p = head
for c in s[1:]:
    p.next = ListNode(c)
    p = p.next

k = 3
new_head = reverseKGroup(head, k)

while new_head:
    print(new_head.val, end='')
    new_head = new_head.next

该代码中,首先将字符串中的每个字符作为一个链表节点组成链表,然后使用reverseKGroup函数按照每3个节点为一组进行翻转操作,并输出翻转后的链表的每个节点值。运行结果为:

dnicadopip.moc

可以看到,经过翻转节点操作后,原本的字符串pidancode.com被反转成了dnicadopip.moc。

相关文章