两两交换链表中的节点
题目: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 := headcur := pre.Nexttail := swapPairs(cur.Next)pre.Next = tailcur.Next = prereturn cur
}
递归会使用额外的栈,一般不推荐使用。
方法二:
也可以不使用递归,要记住,递归代码转换成非递归代码不一定需要使用栈,但是使用栈一定能将递归代码转化为非递归代码。具体思路参考:代码随想录 (programmercarl.com)
func swapPairs(head *ListNode) *ListNode {// 头指针hp := &ListNode{Next: head,}pre := hp// 模拟指针每次交换两个节点位置的指针变化for head != nil && head.Next != nil {pre.Next = head.Nextnext := head.Next.Nexthead.Next.Next = headhead.Next = nextpre = headhead = next}return hp.Next
}