題目大意:
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;
}
};