由于最近在学c++,在看c++primer,所以leetcode做的题也不是很多了,这个题是很长时间做的,一直想写一下博客
但是一直没来得及,现在我说一下我做这道题的思路:
首先我用的是左右指针来操作链表的,所以必须定义两个指针即左指针和右指针,因此想定义一个左指针和右指针得
保证你所定义的指针所指向的区域不能为空。
struct ListNode* swapPairs(struct ListNode* head)
{
if(head==NULL||head->next==NULL)
return head;
struct ListNode*l=head;
struct ListNode*r=head->next;
如上就是此函数对于指针的定义和初始化,
然后就是做第一步的交换以为第一个位置和第二个位置都不为空
因为在leetcode中的头节点是有数据存储的,所以所有链表传参都是头指针(跑题了~)
回到本题,首先做一步交换再进入循环,这样如果是只有第三个节点没有第四个节点时,可以很好的控制循环的条件。
所以先进行一步交换(这里的考点就是灵活的运用双指针对于链表的操作)。
l->next=r->next;
r->next=l;
head=r;
注意* 头指针一定不要忘记链接交换过来的第一个节点因为最后要返回头指针所以一定不能落下。
接下来就是进入循环了,注意左右指针的移动规律就好,下面贴一下全部的代码。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head)
{
if(head==NULL||head->next==NULL)
return head;
struct ListNode*l=head;
struct ListNode*r=head->next;
l->next=r->next;
r->next=l;
head=r;
struct ListNode*p=l;
while(l->next!=NULL && l->next->next!=NULL)
{
l=l->next;
r=l->next;
l->next=r->next;
r->next=l;
p->next=r;
p=l;
}
return head;
}