正题 实现两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
解析:
假设我们不考虑 你不能只是单纯的改变节点内部的值**,而是需要实际的进行节点交换。
这句话,我们实现起来就非常容易了。这里可以简单的做一个实现,但这不是题目要求的解题思路。
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
};
结果上是完全一致的,提交检测也是可以通过,但是我们如果根据要求去交换节点应该如何去实现呢?
划重点:所谓节点的交换而非内部值的交换,意思是更换节点的指针达到交换节点的目的,而非更换内容。
使用迭代法进行更换,步骤:
- 在head前设置虚拟节点
- 将虚拟节点的下一个节点暂定为 Node1, 下下个节点暂定为Node2
- 将虚拟节点 next 指向 Node2
- 将 Node1 的 next 指向 Node2 的 next
- 将 Node2 的 next 指向 Node1
- 将 Node1 设置为新的虚拟节点
- 重复以上操作
是不是看的比较混乱又看不明白?所以请看图:
是不是一目了然了,如此一来实现了第一个互换,并且重置了虚拟节点的位置。依次下去即可完成呼唤。
边界问题: 当虚拟节点不存在 下下个节点
的时候即为结束.这一点不难考虑到。
实现代码:
/**
* 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
};
这样交换确实可以实现,但是如何去想到这样交换呢?没办法,只能多看类似链表交换的题型,这等于白说,但真的是真理!