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.
题目解析:
(1)就是一般的链表操作,但是需要注意链表是空的,一个元素,奇数个元素,偶数个元素的不同情况。
(2)需要处理头节点的操作。
#include <iostream>
using namespace std;
#define NUM 3
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *swapPairs(ListNode *head) {
if(head == NULL)
return head;
if(head->next == NULL)
return head;
ListNode *p = head;
ListNode *q = head->next;
p->next = q->next;
q->next = p;
head = q;
q = p->next;
if(q == NULL)
return head;
ListNode *r = q->next;
if(r == NULL)
return head;
while(p!=NULL && q!=NULL && r!=NULL)
{
q->next = r->next;
r->next = q;
p->next = r;
p = q;
if(p->next !=NULL)
q = p->next;
else
break;
if(q->next !=NULL)
r = q->next;
else
break;
}
return head;
}
void printLinklist(ListNode *head)
{
ListNode *p = head;
while(p!=NULL)
{
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
int main(void)
{
ListNode *head;
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->val = 0;
head = node;
ListNode *p = head;
for(int i = 1;i<=NUM;i++)
{
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->val = i;
p->next = node;
p = node;
}
p->next = NULL;
p = swapPairs(head);
printLinklist(p);
system("pause");
return 0;
}