📌  相关文章
📜  用于在链接列表中从头到尾的第 K 个节点交换第 K 个节点的Java程序(1)

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

用于在链接列表中从头到尾的第 K 个节点交换第 K 个节点的Java程序

在链表数据结构中,我们经常需要对链表节点进行操作,例如删除、添加和交换等。本篇文章将介绍如何在链接列表中从头到尾的第 K 个节点交换第 K 个节点的Java程序。

算法分析

要实现从头到尾的第 K 个节点交换第 K 个节点,我们需要使用以下步骤:

  1. 找到链表中第K个节点,并记录它的前一个节点。
  2. 找到链表中第K个节点。
  3. 将前一个节点的next指针指向第K个节点的下一个节点。
  4. 将第K个节点的next指针指向前一个节点的下一个节点。
  5. 将前一个节点的下一个指针指向第K个节点。
  6. 返回新的链表头节点。
Java代码实现

该算法的Java代码如下所示:

public ListNode swapNodes(ListNode head, int k) {
    // 边界条件判断
    if (head == null) {
        return null;
    }

    // 找到第K个节点
    ListNode curr = head;
    ListNode prev = null;

    for (int i = 1; i < k; i++) {
        prev = curr;
        curr = curr.next;

        if (curr == null) {
            return head;
        }
    }

    // 找到链表中的第K个节点
    ListNode KthNode = curr;

    // 找到第K个节点的前一个节点
    ListNode prevKthNode = prev;

    // 找到尾节点
    ListNode tail = head;

    while (tail.next != null) {
        tail = tail.next;
    }

    // 找到倒数第K个节点
    curr = head;

    for (int i = 1; i < (tail.val - k + 1); i++) {
        curr = curr.next;
    }

    // 找到链表中的倒数第K个节点
    ListNode reverseKthNode = curr;

    // 找到倒数第K个节点的前一个节点
    ListNode prevReverseKthNode = null;
    curr = head;

    for (int i = 1; i < (tail.val - k); i++) {
        curr = curr.next;
    }

    prevReverseKthNode = curr;

    // 交换节点
    if (KthNode == reverseKthNode) {
        return head;
    }

    if (prevKthNode != null) {
        prevKthNode.next = reverseKthNode;
    } else {
        head = reverseKthNode;
    }

    if (prevReverseKthNode != null) {
        prevReverseKthNode.next = KthNode;
    } else {
        head = KthNode;
    }

    ListNode temp = KthNode.next;
    KthNode.next = reverseKthNode.next;
    reverseKthNode.next = temp;

    return head;
}

使用该算法,我们可以有效地从头到尾的第K个节点交换第K个节点。