返回

JavaScript初探LeetCode第24题:巧妙掌握两两交换链表节点的奥妙

前端

SEO关键词:

正文:

欢迎各位开发者来到LeetCode的第24题:“两两交换链表中的节点”。这道题是LeetCode链表系列题中的一颗璀璨明珠,它考验着您对链表数据结构的理解和操作能力。

首先,让我们来分析一下这道题的背景和要求:

给定一个链表,要求将链表中相邻的两个节点进行交换,并返回交换后的链表。例如,给定链表1->2->3->4->5,交换后应为2->1->4->3->5。

现在,让我们一步一步地探索这道题的解题过程:

  1. 确定目标节点:
    首先,我们需要确定需要交换的相邻节点。我们可以使用两个指针来表示链表中的节点,一个指针指向当前节点,另一个指针指向下一个节点。当这两个指针指向相邻节点时,即可进行交换。

  2. 交换节点:
    一旦确定了需要交换的节点,我们就可以进行交换了。具体步骤如下:

    • 将当前节点的next指针指向下一个节点的next指针。
    • 将下一个节点的next指针指向当前节点。
    • 将当前节点的next指针指向下一个节点。
  3. 继续交换:
    完成上述步骤后,相邻节点已交换位置。我们需要继续交换链表中的其他相邻节点,直到交换完成。我们可以使用一个循环来实现这一目的。

  4. 返回结果:
    当交换完成时,我们需要返回交换后的链表。我们只需要返回链表的头节点即可。

除了上述步骤外,我们还需要考虑一些特殊情况:

  1. 链表为空或只有一个节点:
    如果链表为空或只有一个节点,则无法进行交换,因此我们需要对这些情况进行特殊处理。

  2. 链表长度为奇数:
    如果链表的长度为奇数,则最后两个节点无法交换。因此,我们需要对这种情况下进行特殊处理。

现在,让我们将这些步骤和特殊情况用JavaScript代码实现出来:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * Given the head of a linked list, return the head of the list after swapping every two consecutive nodes.
 *
 * Example 1:
 * Input: head = [1,2,3,4]
 * Output: [2,1,4,3]
 *
 * Example 2:
 * Input: head = []
 * Output: []
 *
 * Example 3:
 * Input: head = [1]
 * Output: [1]
 *
 * Constraints:
 * - The number of nodes in the list is in the range [0, 100].
 * - 0 <= Node.val <= 100
 *
 * @param {ListNode} head
 * @return {ListNode}
 */
const swapPairs = (head) => {
  // Check for empty list or single node
  if (!head || !head.next) {
    return head;
  }

  // Create three pointers: prev, curr, and next
  let prev = null;
  let curr = head;
  let next = head.next;

  // Swap the first two nodes
  head = next;
  next = curr;
  next.next = prev;

  // Swap the remaining nodes in pairs
  while (next && next.next) {
    prev = curr;
    curr = next;
    next = next.next;

    curr.next = prev;
    prev.next = next;
  }

  // Connect the last two nodes
  curr.next = prev;

  // Return the new head of the list
  return head;
};

至此,我们就完成了LeetCode第24题“两两交换链表中的节点”的实现。

希望这篇文章对您有所帮助。如果您有任何问题或建议,请随时在评论区留言。