📌  相关文章
📜  用于交替拆分给定单链表的Python程序 - 集 1(1)

📅  最后修改于: 2023-12-03 14:56:19.131000             🧑  作者: Mango

用于交替拆分给定单链表的Python程序 - 集 1

这是一个Python程序,用于交替拆分给定单链表。它可以将一个单链表按照奇偶性拆分成两个单链表。

代码示例

下面是完整的Python代码片段:

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

def oddEvenList(head: ListNode) -> ListNode:
    if not head: # head为空时,返回None
        return None
    # 创建两个单链表:odd和even
    odd, even = head, head.next
    # 分别指向odd和even的最后一个节点,方便后面拼接
    odd_tail, even_tail = odd, even
    while even_tail and even_tail.next:
        # odd_tail的next指向even_tail的next
        odd_tail.next = even_tail.next
        # 移动odd_tail指针到下一个位置
        odd_tail = odd_tail.next
        # even_tail的next指向odd_tail的next
        even_tail.next = odd_tail.next
        # 移动even_tail指针到下一个位置
        even_tail = even_tail.next
    # 拼接两个单链表
    odd_tail.next = even
    return odd
代码解读

这个程序使用了两个指针 oddeven 来分别代表奇数和偶数单链表的头节点。

odd_taileven_tail 初始时指向 oddeven 的头节点,用来指向每个单链表的最后一个节点。

程序使用 while 循环来遍历单链表,当遍历到最后一个偶数节点时退出循环。在循环中,程序将奇数节点的 next 指向下一个偶数节点,然后将偶数节点的 next 指向下一个奇数节点。这个过程可以用下面的图来表示:

原始单链表:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> None
                             ^
                             |
循环第一次后:1 -> 3 -> 2 -> 4 -> 5 -> 6 -> 7 -> 8 -> None
                                       ^
                                       |
循环第二次后:1 -> 3 -> 5 -> 2 -> 4 -> 6 -> 7 -> 8 -> None
                                                 ^
                                                 |
循环第三次后:1 -> 3 -> 5 -> 7 -> 2 -> 4 -> 6 -> 8 -> None

在循环结束后,程序将奇数单链表的最后一个节点的 next 指向偶数单链表的头节点,然后返回奇数单链表的头节点。

总结

这个Python程序可以用来交替拆分给定单链表。它的核心思想是在遍历单链表的过程中,将奇数节点的 next 指向下一个偶数节点,然后将偶数节点的 next 指向下一个奇数节点。最后再将奇数单链表的最后一个节点的 next 指向偶数单链表的头节点即可。