[路飞]_程序员必刷力扣题: 交换链表中的节点

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

交换链表中的节点

力扣链接

给你链表的头节点 head 和一个整数 k 。

交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。

示例 1:

linked1.jpg

输入: head = [1,2,3,4,5], k = 2
输出: [1,4,3,2,5]
复制代码

示例 2:

输入: head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出: [7,9,6,6,8,7,3,0,9,5]
复制代码

示例 3:

输入:head = [1], k = 1
输出:[1]
复制代码

示例 4:

输入:head = [1,2], k = 1
输出:[2,1]
复制代码

示例 5:

输入:head = [1,2,3], k = 2
输出:[1,2,3]
复制代码

双指针

思路

  • 只需要交换节点的值
  • 找到两个节点

这里使用双指针来找到两个节点,我们声明两个节点fast和slow

通过表里链表k次找到第k个节点,用tar变量保存第k个节点

继续从fast向后遍历到末尾并且同时slow开始移动,当fast指向最后一个节点的时候,slow刚好指向倒数第k个节点信息

最后将tar和slow节点的值交换,返回head节点即可

var swapNodes = function(head, k{
    var fast = slow = head
    while(--k){
        fast = fast.next
    }
    var tar = fast
    while(fast.next){
        fast = fast.next
        slow = slow.next
    }
    var temp = tar.val
    tar.val = slow.val
    slow.val = temp
    return head
};
复制代码

数组+遍历=>进阶替换节点

思路

当我们要交换链表两个节点时,我们需要考虑

  • 只需要交换两节点的值,不过这里我们尝试直接交换两个节点
  • 找到链表中对应的节点,以及对应的上下级节点(后续需要改变指向)
  • 处理边界

这里我使用数组来保存每个节点,这样数组的小标就是每个节点对应的位置

那么交换正数k和倒数k的下标就分别是k-1和n-k

我们在数组里先把 这两个下标的节点位置调换

接下来只需要处理next指针就好了

我们直接使用遍历的方式,从头到尾从新给next赋值一下,最后一个节点的next = null

返回头结点即可

var swapNodes = function(head, k{
    if(!head) return head
    var stack = []
    while(head){
        stack.push(head)
        head = head.next
    }
    var n = stack.length
    var temp = stack[k-1]
    stack[k-1] = stack[n-k]
    stack[n-k] = temp
    for(var i=0;i<n-1;i++){
        stack[i].next = stack[i+1]
    }
    stack[n-1].next = null
    return stack[0]
};
复制代码

猜你喜欢

转载自juejin.im/post/7032642194355781640