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.
这道题比较简单,交换链表每相邻的两个结点。不允许直接修改结点数据域。
要注意的是链表为空、结点总数为奇数的情况。
待辅助头结点dummy的写法:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
//ListNode **pp = &head;
//ListNode *dummy = new ListNode(0), *p = dummy;
//dummy->next = head;
//ListNode *p1 = p->next, *p2 = NULL;
//if (p1) p2 = p1->next;
//while (p1&&p2) {
// p->next = p2;
// p1->next = p2->next;
// p2->next = p1;
// p = p1;
// p1 = p->next;
// if (p1)p2 = p1->next;
//}
//return dummy->next;
ListNode *dummy = new ListNode(0), *p = dummy;
dummy->next = head;
ListNode *p1, *p2;
while ((p1 = p->next) && (p2 = p1->next)) {
p->next = p2;
p1->next = p2->next;
p2->next = p1;
p = p1;
}
return dummy->next;
}
};
使用二级指针写法
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode **pp = &head;
ListNode *p1, *p2;
while ((p1 = *pp) && (p2 = p1->next))
{
*pp = p2;
p1->next = p2->next;
p2->next = p1;
pp = &(p1->next);
}
return head;
}
};