📌  相关文章
📜  从链表的开头和结尾交换第一个奇数和偶数值的节点(1)

📅  最后修改于: 2023-12-03 15:36:20.885000             🧑  作者: Mango

从链表的开头和结尾交换第一个奇数和偶数值的节点
简介

在链表中交换第一个奇数和偶数值的节点可以遵循以下步骤:

  1. 从头节点开始遍历链表,记录第一个偶数值节点(evenNode)和第一个奇数值节点(oddNode)
  2. 从尾节点开始遍历链表,记录最后一个偶数值节点(evenNodeEnd)和最后一个奇数值节点(oddNodeEnd)
  3. 如果evenNode和oddNode不同时存在,就交换它们的值
  4. 如果evenNodeEnd和oddNodeEnd不同时存在,就交换它们的值
代码实现
def swap_first_odd_even_nodes(head):
    # 从头节点开始遍历链表,记录第一个偶数值节点(evenNode)和第一个奇数值节点(oddNode)
    evenNode = None
    oddNode = None
    currNode = head
    while currNode:
        if currNode.val % 2 == 0:
            evenNode = currNode
        else:
            oddNode = currNode
            break
        currNode = currNode.next

    # 从尾节点开始遍历链表,记录最后一个偶数值节点(evenNodeEnd)和最后一个奇数值节点(oddNodeEnd)
    evenNodeEnd = None
    oddNodeEnd = None
    currNode = head
    while currNode:
        if currNode.val % 2 == 0:
            evenNodeEnd = currNode
        else:
            oddNodeEnd = currNode
        currNode = currNode.next

    # 如果evenNode和oddNode不同时存在,就交换它们的值
    if evenNode and oddNode:
        evenNode.val, oddNode.val = oddNode.val, evenNode.val

    # 如果evenNodeEnd和oddNodeEnd不同时存在,就交换它们的值
    if evenNodeEnd and oddNodeEnd and evenNodeEnd != oddNodeEnd:
        evenNodeEnd.val, oddNodeEnd.val = oddNodeEnd.val, evenNodeEnd.val
    
    return head
测试

| Test Case | Input | Output | | --- | --- | --- | | Test Case 1 | 1 -> 2 -> 3 -> 4 -> 5 | 2 -> 1 -> 3 -> 4 -> 5 | | Test Case 2 | 1 -> 3 -> 5 -> 7 -> 9 | 1 -> 3 -> 5 -> 7 -> 9 | | Test Case 3 | 2 -> 4 -> 6 -> 8 -> 10 | 2 -> 4 -> 6 -> 8 -> 10 | | Test Case 4 | 1 -> 2 -> 3 -> 4 -> 6 -> 5 | 2 -> 1 -> 3 -> 4 -> 6 -> 5 | | Test Case 5 | 1 -> 2 | 2 -> 1 |