绝密笔记 | 【一天一大 lee】两两交换链表中的节点 (难度:中等) – Day20201013

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
}

第一次插入示意图,图画的有些简陋……

正文完