1. 问题理解与解法思路
链表节点交换是算法面试中的经典问题,LeetCode 104题要求我们实现一个函数,将链表中的节点两两交换。比如给定链表 1->2->3->4,处理后应该变成 2->1->4->3。
这个问题的关键在于正确处理指针的指向关系,同时要考虑到链表长度为奇数和偶数时的不同情况。在实际面试中,面试官通常会考察候选人对指针操作的熟练程度以及对边界条件的处理能力。
1.1 递归解法分析
递归解法是最直观的解决思路。基本思想是:
- 交换当前节点和下一个节点
- 递归处理剩下的链表
- 将处理好的子链表连接到当前交换后的节点上
递归的终止条件是当前节点为空或下一个节点为空(即链表长度为0或1时不需要交换)。
python复制def swapPairs(head):
if not head or not head.next:
return head
first = head
second = head.next
first.next = swapPairs(second.next)
second.next = first
return second
递归解法的时间复杂度是O(n),空间复杂度也是O(n)(因为递归调用栈的深度)。虽然代码简洁,但在处理超长链表时可能会有栈溢出的风险。
1.2 迭代解法实现
迭代解法使用三个指针:prev、curr和next。通过循环遍历链表,每次处理两个节点:
- 保存当前节点和下一个节点的引用
- 调整指针指向
- 更新prev指针为交换后的第一个节点
- 移动curr指针到下一组节点的起始位置
python复制def swapPairs(head):
dummy = ListNode(0)
dummy.next = head
prev = dummy
while head and head.next:
first = head
second = head.next
# 交换节点
prev.next = second
first.next = sec
