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.
完整可运行程序(包括输出):
#include <cstdio>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *swapPairs(ListNode *head)
{
if(head == NULL || head->next == NULL)
return head;
// At least two nodes
ListNode *p1 = head, *p2 = head->next, *p3 = NULL;
head = head->next;
while(p1 != NULL)
{
p2 = p1->next;
p3 = p2->next;
p2->next = p1;
if(p3 == NULL || p3->next == NULL)
{
p1->next = p3;
break;
}
else
p1->next = p3->next;
p1 = p3;
}
return head;
}
void print_list(ListNode *head)
{
if(head == NULL)
printf("\n");
else
printf("%d", head->val);
ListNode *p = head->next;
while(p != NULL)
{
printf("->%d", p->val);
p = p->next;
}
printf("\n");
}
int main()
{
int n;
scanf("%d", &n);
int i, tmp;
ListNode *head = NULL, *p = NULL, *q = NULL;
for(i = 0; i < n; i++)
{
scanf("%d", &tmp);
q = new ListNode(tmp);
if(head == NULL)
{
head = q;
p = head;
}
else
{
p->next = q;
p = p->next;
}
}
printf("Before swap the list:\n");
print_list(head);
printf("After swap the list:\n");
head = swapPairs(head);
print_list(head);
return 0;
}