给定一个链表,两两交换其中相邻的节点,并返回交换后的链表,必须交换实际的节点。需要考虑节点数目为奇数的情况
链表数据结构如下:
//Definition for singly - linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
一、两个指针遍历交换。时间复杂度O(N),空间复杂度O(1)
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* left, *right;
ListNode* newHead;
if (head == NULL)
return head;
left = head;
if (head->next == NULL)
newHead = left;
else
{
right = head->next;
left->next = right->next;
right->next = left;
newHead = right;
}
while (left->next)
{
ListNode* temp;
temp = left;
left = left->next;
if (left->next == NULL)
break;
right = left->next;
left->next = right->next;
right->next = left;
temp->next = right;
}
return newHead;
}
};
二、递归写法。交换后右指针的next是原先next指向的list进行swapPairs的结果。时间复杂度O(N),空间复杂度O(N)
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == NULL)
return head;
ListNode* left, *right;
left = head;
if (head->next)
{
right = head->next;
ListNode* tail;
tail = swapPairs(right->next);
left->next = tail;
right->next = left;
}
else
{
right = left;
}
return right;
}
};