分类:algorithm| 发布时间:2016-07-09 09:09:00
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->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) {
ListNode **pp = &head, *a, *b;
while ((a = *pp) && (b = a->next)) {
a->next = b->next;
b->next = a;
*pp = b;
pp = &(a->next);
}
return head;
}
};
这个方法重点在于使用二级指针修改上一个节点的 next 指针(循环的第一次修改的是 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 || !head->next) {
return head;
}
ListNode *a = head, *b, *pre = 0;
head = head->next;
while (a && a->next) {
b = a->next;
a->next = b->next;
b->next = a;
if (pre) pre->next = b;
pre = a;
a = a->next;
}
return head;
}
};