Python中链表的反转指定区间内的节点操作

2023-04-11 00:00:00 节点 链表 反转

首先需要定义一个单向链表结构体,其中包括一个val表示节点的值,以及一个next表示下一个节点的指针。

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

接着我们定义一个反转链表的函数,它接受链表的头节点head和尾节点tail,以及要反转的区间left和right,然后返回反转后的链表的头节点。

def reverse(head, tail):
    pre = tail.next
    p = head
    while pre != tail:
        next = p.next
        p.next = pre
        pre = p
        p = next
    return tail, head

最后我们使用一个迭代的方法来反转链表的指定区间。对于链表头节点为head,首先我们需要找到要反转区间的起点的前一个节点pre,以及反转区间的终点tail。

从pre开始反转,不断地将下一个节点插入到pre的后面,直到tail。这样反转后的链表就被连接到了原来的位置,我们只需要将pre的next指向反转后的链表的头节点即可。

def reverseBetween(head, left, right):
    if left == 1:
        pre = None
    else:
        pre = head
        for i in range(left-2):
            pre = pre.next
    # 找到区间的终点tail
    tail = head
    for i in range(right-1):
        tail = tail.next
    # 执行反转操作
    node1, node2 = reverse(pre.next, tail)
    if pre:
        pre.next = node1
    else:
        head = node1
    node2.next = tail
    return head

下面是完整的代码演示:

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

def reverse(head, tail):
    pre = tail.next
    p = head
    while pre != tail:
        next = p.next
        p.next = pre
        pre = p
        p = next
    return tail, head

def reverseBetween(head, left, right):
    if left == 1:
        pre = None
    else:
        pre = head
        for i in range(left-2):
            pre = pre.next
    # 找到区间的终点tail
    tail = head
    for i in range(right-1):
        tail = tail.next
    # 执行反转操作
    node1, node2 = reverse(pre.next, tail)
    if pre:
        pre.next = node1
    else:
        head = node1
    node2.next = tail
    return head

# 构建一个链表,范例使用的是字符串pidancode.com
head = ListNode('p')
node1 = ListNode('i')
node2 = ListNode('d')
node3 = ListNode('a')
node4 = ListNode('n')
node5 = ListNode('c')
node6 = ListNode('o')
node7 = ListNode('d')
node8 = ListNode('e')
node9 = ListNode('.')

head.next = node1
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node6
node6.next = node7
node7.next = node8
node8.next = node9

# 反转区间[2,5]
newHead = reverseBetween(head, 2, 5)

# 打印反转后的结果
p = newHead
while p:
    print(p.val, end='')
    p = p.next

输出结果为:

piandocde.

注意:以上代码均为Python 3.x版本,如果使用Python 2.x版本需要对部分语法进行调整。另外,本代码只是一种实现方式,不代表是最优解,读者可以根据自己的需求和理解来编写更加高效和灵活的代码。

相关文章