两两交换链表中的节点
题目:24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
方法一:
这是一个模拟题,模拟交换的过程就行了,从链表尾执行,每次返回执行后的头节点,每次执行时将反转后节点的后继连接返回的头结点。
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
pre := head
cur := pre.Next
tail := swapPairs(cur.Next)
pre.Next = tail
cur.Next = pre
return cur
}
递归会使用额外的栈,一般不推荐使用。
方法二:
也可以不使用递归,要记住,递归代码转换成非递归代码不一定需要使用栈,但是使用栈一定能将递归代码转化为非递归代码。具体思路参考:代码随想录 (programmercarl.com)
func swapPairs(head *ListNode) *ListNode {
// 头指针
hp := &ListNode{
Next: head,
}
pre := hp
// 模拟指针每次交换两个节点位置的指针变化
for head != nil && head.Next != nil {
pre.Next = head.Next
next := head.Next.Next
head.Next.Next = head
head.Next = next
pre = head
head = next
}
return hp.Next
}