「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」
交换链表中的节点
给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
示例 1:
输入: 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]
};
复制代码