leetcode第24题我们的任务是有部分地反转链表,那么首先我们会想起反转链表,那么我们先把链表反转给写出来:
ListNode* reservelink(ListNode *l)
{
ListNode *p=l;
ListNode *r;
ListNode *q=l->next;
p->next=NULL;
while(q)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
return p;
}
接下来我们要做的事情很简单,第一步,使我们的当前第二个节点指向第三个(交换后其实我们的链表处于断开状态)第二步,把p,q各往后移动一位
/**
* 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) {
ListNode *p=head;
ListNode *r;
ListNode *q=head->next;
while(q&&q->next)//注意这里跳出循环的条件有不同
{
r=q->next;
q->next=p;
p->next=r;//使链表不断
p=r;
q=r->next;//移动p,q
}
}
};
但是这个时候我们发现了一个问题,就是我们的各个指针在这个程序中不断运动——我们链表的首节点被弄丢了!
但这也很好解决,只要添加一个空节点使他的next指向head->next就可以了,最后返回这个空节点的next。