24. 两两交换链表中的节点

24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

解法一:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func swapPairs(head *ListNode) *ListNode {
  // 设置一个虚拟头节点(哑节点)简化操作 dummy := &ListNode{ Next: head, } // 设cur为0,这里的0指值,而不是位置 cur := dummy for head != nil && head.Next != nil { // 防止无法链接到3,提前保留3的节点 temp := head.Next.Next // 0 ——> 2 cur.Next = head.Next // 2 ——> 1 head.Next.Next = head // 1 ——> 3 head.Next = temp // 将值为1(此时该节点到了索引为1的位置)的节点赋给cur cur = head // 将值为3,位置在2的节点赋给head进行下一轮迭代处理 head = temp } return dummy.Next }

 解法二:

// 递归版本
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    next := head.Next
    head.Next = swapPairs(next.Next)
    next.Next = head
    return next
}

 

posted on 2022-10-14 22:37  HHHuskie  阅读(24)  评论(0编辑  收藏  举报

导航