Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
题目要求链表不能修改,只能修改Node,这样反而使得题目变的简单了;有兴趣的可以尝试下,只能修改链表,不能修改node,也就是说要两两反转链表,而且也是在常数空间,以及O(n)的时间完成。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//修改node,不修改List
void Swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
ListNode* swapPairs(ListNode* head) {
if(head == NULL)
return NULL;
ListNode *tmpNode = head;
while(tmpNode != NULL && tmpNode->next != NULL)
{
Swap(tmpNode->val, tmpNode->next->val);
tmpNode = tmpNode->next->next;
}
return head;
}
};
直接反转指针
/**
* 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 == NULL)
return NULL;
ListNode *curNode = head, *bNode = head, *nextNode = NULL;
while(curNode != NULL && curNode->next != NULL)
{
nextNode = curNode->next;
if(curNode == head)
{
head = nextNode;
}
else
{
bNode->next = nextNode;
}
curNode->next = nextNode->next;
nextNode->next = curNode;
bNode = curNode;
curNode = curNode->next;
}
return head;
}
};