题目来源:https://leetcode-cn.com/problems/swap-nodes-in-pairs/description/
题目描述:
算法描述:该题目有两种方法解决,一种递归,一种非递归
非递归方法:
1.如果链表只有一个或者没有节点的话,直接返回head。
2.然后先交换第一个和第二个节点。(因为如果只有两个结点的话这是一种特殊情况,需要单独处理)
3.如果第一个结点和第二个节点交换完成以后,还有结点,就用循环进行交换。
代码如下:
struct ListNode* swapPairs(struct ListNode* head) {
if(!head||!head->next) return head;//链表只有一个结点或没有节点时直接返回
struct ListNode* l=head;//定义需要交换的左右节点
struct ListNode* r=l->next;
struct ListNode* p;
l->next=r->next;//交换第1个和第二个结点
r->next=l;
head=r;//头指针挪到原来的第二个节点上(现在是第一个结点),完成前两个结点的交换
p=l;//p赋值为第一对交换成功的右节点
while(l->next&&l->next->next){//如果剩余节点为0或1则返回head,否则进入循环
l=l->next;//转换到下一节点对
r=l->next;
l->next=r->next;//交换节点l,r
r->next=l;
p->next=r;
p=l;
}
return head;
}
递归方法:
利用递归的思想,依次交换链表中的节点对。具体对于每个节点来说:
1.若该节点为NULL,则直接返回NULL
2.若该节点的下一个节点为NULL,则直接返回该节点
3.交换该节点与下一个节点,利用辅助指针记录该节点的下一个节点,并递归的交换接下来的节点对
该方法虽然比较简单,但由于是递归所以运行时间会比较长。
代码如下:
struct ListNode* swapPairs(struct ListNode* head) {
if(!head) return NULL;
if(!head->next) return head;
struct ListNode* temp=head->next;
head->next=swapPairs(temp->next);
temp->next=head;
return temp;
}