JS实现两两交换链表中的节点

692 阅读2分钟

正题 实现两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

image.png

解析:

假设我们不考虑 你不能只是单纯的改变节点内部的值**,而是需要实际的进行节点交换。这句话,我们实现起来就非常容易了。这里可以简单的做一个实现,但这不是题目要求的解题思路。

var swapPairs = function(head) {
    let p = head
    let index = 0
    while(p) {
        if(index % 2 === 0 && p.next) {
            let val = p.val
            p.val = p.next.val
            p.next.val = val
        }
        index++
        p = p.next
    }
    return head
};

结果上是完全一致的,提交检测也是可以通过,但是我们如果根据要求去交换节点应该如何去实现呢?

划重点:所谓节点的交换而非内部值的交换,意思是更换节点的指针达到交换节点的目的,而非更换内容。

使用迭代法进行更换,步骤:

  1. 在head前设置虚拟节点
  2. 将虚拟节点的下一个节点暂定为 Node1, 下下个节点暂定为Node2
  3. 将虚拟节点 next 指向 Node2
  4. 将 Node1 的 next 指向 Node2 的 next
  5. 将 Node2 的 next 指向 Node1
  6. 将 Node1 设置为新的虚拟节点
  7. 重复以上操作

是不是看的比较混乱又看不明白?所以请看图:

5.gif

是不是一目了然了,如此一来实现了第一个互换,并且重置了虚拟节点的位置。依次下去即可完成呼唤。

边界问题: 当虚拟节点不存在 下下个节点 的时候即为结束.这一点不难考虑到。

实现代码:

/**
 * 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) {
//     let p = head
//     let index = 0
//     while(p) {
//         if(index % 2 === 0 && p.next) {
//             let val = p.val
//             p.val = p.next.val
//             p.next.val = val
//         }
//         index++
//         p = p.next
//     }
//     return head
// };

var swapPairs = function(head) {
   let tempNode = new ListNode(0)
   tempNode.next = head
   let temp = tempNode
   while(temp.next && temp.next.next) {
     let node1 = temp.next
     let node2 = temp.next.next
     temp.next = node2
     node1.next = node2.next
     node2.next = node1
     temp = node1
   }
   return tempNode.next
};

这样交换确实可以实现,但是如何去想到这样交换呢?没办法,只能多看类似链表交换的题型,这等于白说,但真的是真理!