「LeetCode 24」两两交换链表中的节点

113 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

两两交换链表中的节点

  • 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

测试用例

输入:head = [1,2,3,4]
输出:[2,1,4,3]
输入:head = []
输出:[]
输入:head = [1]
输出:[1]

题目地址(https://leetcode-cn.com/problems/swap-nodes-in-pairs/)

代码实现

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
    var headNode = new ListNode(null, head);
    var pre = headNode;
    var cur = head;
    while(cur?.next){
        let curNode = cur;
        let nextNode = cur.next;
        curNode.next = nextNode.next;
        pre.next = nextNode;
        nextNode.next = curNode;
        pre = curNode;
        cur = curNode.next;
    }
    return headNode.next;
};

解题思路

通过迭代的方式实现两两交换链表中的节点,直接遍历整个链表即可,首先定义一个空的头结点 headNode,之后定义前置节点与当前正需要处理的节点,当正在处理的节点 cur 存在以及当前节点的下一个节点 cur.next 都存在时进行循环,将当前节点与当前节点的下一个节点进行缓存,之后将 curNode 节点的 next 赋值为 nextNode 节点的 next,即首先将该节点的下一个节点指向 nextNode 的下一个节点,之后将 prenext 赋值为 nextNode ,将 nextNodenext 赋值为 curNode,最后将 pre 赋值为 curNodecur 赋值为 curNodenext,注意此时的 curNode 其实已经被交换换成了,是两个节点中的后一个节点,最后等待循环完成后返回头结点headNodenext 即可。