题目大意:
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.
---------------------------------------------------------------------------------------------------------------------------------------------------两两交换链表中的节点,但是不能使用额外的存储空间,而且不允许修改节点val域;
算法不难,但需要注意一些细节:
1.奇数个节点;
2.交换后的指针指向问题,比如:1->2->3->4,两两交换后,为:2->1->3,原因是过去1的指针指向了3,3与4交换后,1的指针还指向了3,这时就需要记录原来1的指针,在3与4交换后,在将1的next修改为4,才能得到2->1->4->3
代码如下:
/**
* 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;
bool flag = true;
ListNode *cur = head;
ListNode *res = head;
ListNode *pre = cur;
while(cur != NULL)
{
ListNode *node;
if(cur->next == NULL)
break;
node = cur->next;
if(flag)
{
res = node;
flag = false;
}
cur->next = node->next;
node->next = cur;
pre = cur;
cur = cur->next;
if(cur != NULL && cur->next != NULL)
pre->next = cur->next;
}
return res;
}
};