给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定1->2->3->4
, 你应该返回2->1->4->3
.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
- 思路:通过递归两两交换节点
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { if(head==nullptr)//如果head为空则直接返回 return head; ListNode *curr=head->next; if(curr&&curr->next)//若果curr存在而且curr->next也存在时 { ListNode *p=curr->next;//交换后原来第一个节点现在变成了第二个节点,递归构造它的新后继 curr->next=head;//交换两个节点 head->next=swapPairs(p);//建立正向链接 return curr;//每次都返回子链表的表头指针 } else if(curr&&!curr->next){//curr->next不存在时,只需交换节点,并将末尾节点的后继置位空节点即可 curr->next=head; head->next=nullptr; return curr; } else{//只有一个节点时,不用交换,直接返回 return head; } } };