20201013
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路
交换的逻辑:
交换的逻辑
// 记录节点next指针
temp = node.next
// 更新next指针
node.next = temp.next
// 连接新链表next指针
temp.next = node
抛砖引玉
/**
* 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 node = new ListNode(),
prevNode = node
while (head && head.next) {
const temp = head.next
// 追加到新列表
prevNode.next = temp
head.next = temp.next
temp.next = head
// 更新新链表中上一个节点指针
prevNode = head
// 更新指针交换下一组子链
head = head.next
}
// 返回新链表的根
return node.next
}
在原链表中交换
交换的逻辑
假设只有两个节点:head 表示原始链表的根节点,那么从其 next 节点与其交换,交换完成
那么如果有多组节点:反正传入节点和其 next,然后返回两个交换节点后面的节点,这样一组一组递归交换下去则可以得到满足要求的链表
var swapPairs = function(head) {
if (head === null || head.next === null) return head
const node = head.next
head.next = swapPairs(node.next)
node.next = head
return node
}
第一次插入示意图,图画的有些简陋......