(一)迭代法
在处理这种问题时,我们通常加上一个dummy头结点指向head,至于思路很清晰了就是隔一个去交换两个相邻结点,比如1->2->3->4->NULL,我们先通过指针交换1和2,再交换3和4,详细的指针操作可以看下面的图:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *dummy=new ListNode(0);
dummy->next=head;
ListNode *prev=dummy,*cur=head;
while(cur&&cur->next)
{
prev->next=cur->next;
cur->next=cur->next->next; //先确定后继
prev->next->next=cur;
prev=cur;
cur=cur->next;
}
return dummy->next;
}
};(二)递归版本
递归一向是以精巧著称,我们只需处理好最基础的一部分,剩下的递归即可。如果读者不是很理解的话,可以手动模拟一下。
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if (head == NULL)
return NULL;
if (head -> next == NULL)
return head;
ListNode *tmp = head -> next;
head -> next = swapPairs(tmp -> next);
tmp -> next = head; // 指向下一部分
return tmp;
}
};

本文介绍了一种链表中节点的交换算法,包括迭代法和递归法两种实现方式。迭代法通过添加一个虚拟头结点来简化边界条件处理,并通过指针操作逐对交换相邻节点;递归法则通过递归调用简化代码,实现简洁高效。
270

被折叠的 条评论
为什么被折叠?



