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
}