题目:https://leetcode.com/problems/swap-nodes-in-pairs/
思路:
真是个让人头晕的问题,头晕的地方在于指针,不过记住指针其实就是个地址就行了。题目的意思是奇数项和偶数项交换,先假设输入数组就是偶数个数字的,那其实就是a[i]与a[i+1]为一对一对的交换,但是由于是单链表而且不允许做值交换,只能通过改变next指针实现了。
我们假设有这么个数组/地址:
value [1, 2, 3, 4, 5, 6] address [0x1, 0x2, 0x3, 0x4, 0x5, 0x6]
很显然的,如果两个数的值进行交换,我们就需要找个临时变量存着,这里也是一样。本题的主要思路就是,不能乱,一对一对的来…
只看中间的3,4两项为一对,且假设其他一切都安排妥当了[2, 1, (当前对), 5, 6],那么变换后的结果是 [3]->next = [5], [4]->next = [3]并且[1]->next = [4]. 然后具体而言分下面几步:
- 当前工作指针curr是[3],记住[3]的后续节点[4]的位置,即temp = 0x4;
- 把[3]和[5]连上,即 [3]->next = temp->next = 0x5;
- 把[4]放到[3]前面,即temp->next = [3] (0x3);
- 把[2]和[4]连上,即[2]->next = temp; 所以整个环节中还需要存一个[3]的前序节点的指针(这里是0x2);
- 挪动指针,注意的是只要往后next一下就行了,因为目前的排序已经是[2,1, 4,3, …]了:curr = curr->next (0x5);
搞定主要部分后要注意特殊情况:0输入,1输入,奇数项输入(最后一项不处理就行)
代码:
/**
* 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 head;
if(head->next == NULL)
return head;
ListNode* curr = head;
ListNode* prev = NULL;
head = head->next;
ListNode* temp;
while(curr != NULL && curr->next != NULL){
temp = curr->next;
if(prev != NULL) {
prev->next = temp;
}
curr->next = temp->next;
temp->next = curr;
prev = curr;
//Change of current node
curr = curr->next;
}
return head;
}
};