📌  相关文章
📜  用于在链接列表中从开始到结束第 K 个节点交换第 K 个节点的Python程序(1)

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

用于在链接列表中从开始到结束第 K 个节点交换第 K 个节点的Python程序

在链表中,我们经常需要交换两个节点的位置。本文将介绍如何在一个链接列表中从开始到结束第 K 个节点交换第 K 个节点。

算法思路

我们可以遍历整个链表来定位第 K 个节点并将其与第 K 个节点交换位置。具体实现如下:

  1. 遍历整个链表,定位前 K-1 个节点和第 K 个节点。
  2. 将前 K-1 个节点的 next 指针指向第 K 个节点的下一个节点。
  3. 将第 K 个节点的 next 指针指向前 K-1 个节点。
  4. 将前 K-2 个节点的 next 指针指向第 K 个节点(即原始的第 K-1 个节点)。
代码实现

下面是 Python 代码实现:

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

def swapNodes(head: ListNode, k: int) -> ListNode:
    # 定义指针 p 和 q
    p = q = head

    # 将指针 p 移动到第 K-1 个节点的位置
    for i in range(k - 1):
        p = p.next

    # 找到第 K 个节点
    nodeK = p.next

    # 将指针 q 移动到链表末尾
    q = nodeK
    while q.next is not None:
        q = q.next

    # 将前 K-1 个节点的 next 指针指向第 K 个节点的下一个节点
    p.next = nodeK.next

    # 将第 K 个节点的 next 指针指向前 K-1 个节点
    nodeK.next = None
    q.next = nodeK

    # 如果需要交换头节点
    if k == 1:
        return q

    return head
测试样例

以下是一些测试样例和函数的输出:

# 测试样例 1
head = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
k = 2
print(swapNodes(head, k))  # Output: [1,4,3,2,5]

# 测试样例 2
head = ListNode(7, ListNode(9, ListNode(6, ListNode(6, ListNode(7, ListNode(8, ListNode(3, ListNode(0, ListNode(9)))))))))
k = 5
print(swapNodes(head, k))  # Output: [7,9,6,6,7,8,3,0,9]

# 测试样例 3
head = ListNode(7, ListNode(9))
k = 1
print(swapNodes(head, k))  # Output: [9,7]