1.1. 题目

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

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

两两交换链表中的节点

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

示例 2:

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

示例 3:

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

提示:

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



1.1.2. 题解:

  • 每两位交换链表,不能仅仅变换链表的值

1.1.3. 思路:

  • 第一,如果链表为空或者链表为一位的时候,直接返回原链表
  • 第二,假设链表是 1,2,3,4,5
    • 那么好理解的话, 那么可以先考虑加个空的临时头好做理解,变成 0,1,2,3,4,5
    • 那么此刻指针位置在0,0的下一个是1(0.next),1的下一个是2(0.next.next),2的下一个是3(0.next.next.next)
    • 把1的后面换成3,0的后面换成2,然后2的后面换成1, 也就是 0,2,1,3,4,5
    • 然后把当前指针移动后两位,变成 1,那么此时链表可以看成 1,3,4,5 开始用上面同样的方式变换 3 和 4
  • 用上面的方法是为了好理解,其实并不需要加一个临时的头.. 直接从第一个值开始也一样

1.1.4. 代码:

点击显示
type ListNode struct {
    Val  int
    Next *ListNode
}

func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }

    newHead := &ListNode{
        Val:  0,
        Next: head,
    }

    tempHead := newHead

    var next, nextNext *ListNode
    for tempHead.Next != nil && tempHead.Next.Next != nil {
        next = tempHead.Next
        nextNext = tempHead.Next.Next
        next.Next = nextNext.Next
        nextNext.Next = next
        tempHead.Next = nextNext
        tempHead = tempHead.Next.Next
    }
    return newHead.Next
}

代码

results matching ""

    No results matching ""