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

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

mid

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

image-20220803124235069

迭代

简单

用个伪头节点记录初始位置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func swapPairs(head *ListNode) *ListNode {
	fakeHead := &ListNode{Next: head}
	pre := fakeHead
	for pre.Next != nil && pre.Next.Next != nil {
		p, q := pre.Next, pre.Next.Next
		// p q 交换
		pre.Next = q
		p.Next = q.Next
		q.Next = p

		pre = p
	}
	return fakeHead.Next
}

递归

先交换头两个节点,之后的节点递归交换,其实还是迭代的思想

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func swapPairs(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}

	p, q := head, head.Next
	p.Next = q.Next
	q.Next = p
	p.Next = swapPairs(p.Next)

	return q
}