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;
}
};