题目连接:两两交换链表中的节点
1.方法一
a. 题目分析
交换最开始的两个节点,后面的逻辑应该是一样的,所以可以用递归来实现。
b. 示例代码
/**
* 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 || !head->next){
return head;
}
ListNode* front = head->next;
head->next = swapPairs(front->next);
front->next = head;
return front;
}
};
2.方法二
a. 题目分析
采用非递归的方法的话,不仅要处理两个节点之间的指针,还要处理两个节点之前的节点的指针,为了统一处理,我们可以在
head
节点之前,添加一个dummy
节点。
b. 示例代码
ListNode* swapPairs(ListNode* head) {
ListNode* dummy = new ListNode(0), *cur = dummy;
dummy->next = head;
while(cur->next && cur->next->next){
ListNode* first = cur->next;
ListNode* second = first->next;
cur->next = second;
first->next = second->next;
second->next = first;
cur = first;
}
return dummy->next;
}