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.
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.
Subscribe to see which companies asked this question
这道题不难,但是不能直接交换两个结点里面的值,设p,q是要交换的两个结点,将p指向q->next,相当于删除q,然后把q插入到p的前面即可。头结点需要特殊处理一下。
/**
* 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||head->next==NULL)
return head;
ListNode *p,*q,*prior;
p=head;
prior=head;
while (p->next!=NULL)
{
q=p->next;
p->next=q->next;
q->next=p;
if(prior==head)
{
head=q;
}
else
{
prior->next=q;
}
prior=p;
if(p->next!=NULL) //如果为空,回到while判断的时候会自己退出,
p=p->next; //若这里没有这个判断,直接p=p->next,当p->next为空时,while判断时再用p->next时会异常。
}
return head;
}
};