两两交换链表中的节点
题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
思路
使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。
第一种方法是使用递归
第二章方法是使用迭代
解法
使用递归:
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
}
使用迭代:
func swapPairs(head *ListNode) *ListNode {
dummy := &ListNode{Next: head}
pre := dummy
for pre.Next != nil && pre.Next.Next != nil {
// 获取当前节点的下一个节点
a := pre.Next
// 获取当前节点的下一个节点的下一个节点
b := a.Next
// 交换
pre.Next, a.Next, b.Next = b, b.Next, a
// 移动到下一个节点
pre = a
}
return dummy.Next
}