原题链接:
https://leetcode.com/problems/swap-nodes-in-pairs/description/
题意理解
将单链表中的相邻两元素交换位置
只允许交换节点,不允许交换位置。只允许使用常数的空间。
本质上就是说,如果有A->B->C->D,那么就转成A->C->B->D
实际上只有三步操作:
- A->C
- B->D
- C->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 or !head->next) {
return head;
}
ListNode* fake = new ListNode(-1);
fake->next = head;
ListNode* pre = fake;
while(pre->next and pre->next->next) {
ListNode* node1 = pre->next;
ListNode* node2 = pre->next->next;
pre->next = node2;
node1->next = node2->next;
node2->next = node1;
pre = node1;
}
return fake->next;
}
};
别人最快的代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode* temp = head->next;
head->next = swapPairs(temp->next);
temp->next = head;
return temp;
}
};
最快的代码是直接递归写的。。我也不知道为什么跑那么快